TZ-*_*-EZ 5 java heap heap-memory java-8 spring-boot
我们正在将Java 8 Spring Boot 2用于我们的微服务应用程序。在本地运行负载测试会注意到堆正在消耗内存,但从未释放过。我正在使用G1垃圾收集器运行该应用程序,还通过JVisualVM进行了手动GC,但仍然无法释放分配的内存。
我进行了堆转储并对其进行了分析,我可以清楚地看到由System Class Loader创建的大字节数组被列为泄漏可疑对象。我看到字节数组实例将我的HTTP请求保存到端点“ / test”。但是负载测试已经完成,线程又回到了运行负载测试之前的状态。
不知道为什么系统类加载器加载的字节数组包含所有这些元素,并且无缘无故地占用了所有这些堆。
/ test端点是@RestController类中的唯一方法
@RequestMapping(value = "/test", method = RequestMethod.GET)
@CrossOrigin(origins = "*")
public void test() {
logger.info("Testing1...");
}
Run Code Online (Sandbox Code Playgroud)
以下是与服务器相关的Spring Boot application.properties:
server.port=8090
server.tomcat.max-threads=200
server.tomcat.accept-count=100
server.tomcat.min-spare-threads=20
server.error.whitelabel.enabled=false
server.max-http-header-size=2097152
Run Code Online (Sandbox Code Playgroud)
Tomcat缓存了许多对象以使其运行更快。使用该设置,server.max-http-header-size=2097152您使那些缓存的对象之一声明了2 MB的内存并保留。在这种情况下,它是Http11OutputBuffer,您可以在此处看到它声称(根据您的情况)2 MB的内存。在Http11OutputBuffer由所使用的Http11Processor,你可以看到在这里。
该文档具有以下内容processorCache:
协议处理程序缓存Processor对象以提高性能。此设置指示要缓存多少这些对象。-1表示无限制,默认值为200。如果不使用Servlet 3.0异步处理,则较好的默认设置是使用与maxThreads相同的设置。如果使用Servlet 3.0异步处理,一个很好的默认设置是使用maxThreads中的较大者和预期的并发请求(同步和异步)的最大数量。
因此,我的建议是将设置server.max-http-header-size为更合理的值,例如8KB(默认值),然后在测试显示您确实需要时将其缓慢增加一倍(相关内容:当总标头大小大于时,Tomcat会抛出“ 400 Bad Request” server.max-http-header-size)。
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |