仅返回字符串"OK"的API运行时堆内存占用持续上升的原因是什么?
我开发了一个仅返回字符串"OK"的API。
(接口运行效果截图)
我使用如下配置对该接口进行测试:
(接口测试配置截图)
我通过VisualVM监控程序运行状态,发现堆(Heap)占用持续上升,最终JVM会执行GC。
(VisualVM监控数据截图)
疑问
- 为什么堆内存占用会持续上升?
解答
- 这是JVM的正常运行表现:压测过程中每次请求都会触发底层Web框架、容器生成大量临时对象,包括请求上下文实例、IO缓冲区、响应序列化组件实例等,哪怕你的业务逻辑没有额外创建对象,这部分框架层的对象开销是必然存在的,都是短生命周期的新生代对象。
- JVM的垃圾回收不是实时执行的,默认会等到新生代Eden区占用达到阈值才触发Minor GC,在GC触发前这些临时对象会一直堆积在堆内存中,所以看起来堆占用持续上涨,等GC执行后这些无用对象会被批量回收,内存占用就会回落。
- 你可以观察GC后的堆内存基线,如果每次GC完成后基线没有持续升高,就不存在内存泄漏问题,不需要额外处理。如果GC后基线逐次升高,才需要排查是否有长生命周期对象持有临时对象引用导致的泄漏问题。
内容的提问来源于stack exchange,提问作者eewwq asd
相关产品推荐
相关产品推荐

