【发布时间】:2020-02-13 15:58:18
【问题描述】:
我们正在为我们的微服务应用程序使用 Java 8 Spring Boot 2。在本地运行负载测试注意到堆消耗内存但从未释放回。我正在使用 G1 垃圾收集器运行应用程序,并且还从 JVisualVM 进行了手动 GC,但分配的内存仍然没有被释放。
我对堆转储进行了分析,我可以清楚地看到系统类加载器创建的大字节数组被列为泄漏嫌疑人。我看到字节数组实例将我的 HTTP 请求保存到端点“/test”。但是负载测试已经完成,线程又回到了运行负载测试之前的位置。
不知道为什么系统类加载器加载的字节数组包含所有这些元素并无缘无故地占用所有这些堆。
/test 端点是@RestController 类中的唯一方法
@RequestMapping(value = "/test", method = RequestMethod.GET)
@CrossOrigin(origins = "*")
public void test() {
logger.info("Testing1...");
}
下面是与服务器相关的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
【问题讨论】:
-
你能发布实现/测试端点吗?
-
@maitreyak 我已经发布了只是一个班轮的方法
-
你有多少个 http 工作线程?我怀疑网络服务器为每个线程预先分配了 IO 缓冲区。
-
@radai 我也发布了我的服务器属性。我有最小 20 和最大 200
-
如果你把它固定在 1 个线程上,数字会改变吗?
标签: java spring-boot java-8 heap-memory