当前位置:  开发笔记 > 编程语言 > 正文

Java进程内存使用量不断增加

如何解决《Java进程内存使用量不断增加》经验,为你挑选了1个好方法。

前提条件:

具有16 Gb RAM的PC

在Ubuntu 16.10 x64上安装了JDK 1.8.x.

标准的基于Spring的Web应用程序,部署在Tomcat 8.5.x上.Tomcat配置了下一个参数:CATALINA_OPTS="$CATALINA_OPTS -Xms128m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -Xss512k -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxMetaspaceSize=512m -XX:-TieredCompilation -XX:ReservedCodeCacheSize=512m"

JMeter 2.13用于负载测试运行

JProfiler 9.x用于java堆内存使用情况跟踪

top util用于java进程内存使用情况跟踪

当我连续3次开始加载测试时,我观察(使用top)java进程增加了大量已用内存:

Tomcat启动后使用~1Gb

在第一次测试运行后,它使用4.5Gb

当所有测试完成后,Tomcat正在使用7Gb的RAM

所有这些时间堆大小都是有限的,JProfiler确认 - 堆大小不超过512Mb.

这是JProfiler的截图.底部的红色数字是java进程使用的内存大小(根据top). 在此输入图像描述

问题是:为什么java进程在工作时始终不断增加内存使用量?

谢谢!

UPD#1:关于可能的重复:他们have confirmed that this only happens on Solaris.但我使用的是Ubuntu 16.10.同样,尖锐的问题没有一个可以解释问题原因的答案.

UPD#2:暂停一段时间后我不得不回到这个问题.现在我使用pmaputil来进行java进程使用的内存转储.我有三个转储:在测试运行之前,在第一次测试执行之后和在执行一些N次测试之后.测试它们会为应用程序产生大量流量.所有转储都在这里:https://gist.github.com/proshin-roman/752cea2dc25cde64b30514ed9ed9bbd0.它们非常庞大,但最有趣的东西是第8行的堆大小:它需要282.272 Kb在测试之前,3.036.400 Kb最后 - 超过10倍的差异!每次运行测试时它都在增长.同时堆大小是恒定的(根据JProfiler/VisualVM).我有什么选择才能找到导致此问题的原因?调试JVM?我试图找到任何方法来"看"这段内存,但失败了.所以:

我能以某种方式识别[heap]内存段的内容吗?

java的这种行为看起来如何?

我会很感激有关此问题的任何提示.谢谢大家!

UPD#3:使用jemalloc(感谢@ivan的想法)我得到了下一张图片: 在此输入图像描述

看起来我的问题与此处描述的几乎相同:http://www.evanjones.ca/java-native-leak-bug.html

UPD#4:现在我发现问题与java.util.zip.Inflater/Deflater有关,这些类在我的应用程序的许多地方使用.但是对内存消耗的最大影响使得与删除SOAP服务的交互.我的应用程序使用JAX-WS标准的参考实现,它在负载下给出了下一个内存消耗(它在10Gb之后具有低精度):参考实现的内存消耗 然后我做了相同的负载测试,但是使用Apache CXF实现,它给出了下一个结果: Apache CXF的内存消耗 所以你可以看到CXF使用更少的内存并且它更稳定(它没有像ref.impl一样增长).最后我在JDK问题跟踪器上发现了一个问题 - https://bugs.openjdk.java.net/browse/JDK-8074108 - 这又是关于zip库中的内存泄漏问题,而且问题尚未解决.所以看起来我无法真正解决我的应用程序中的内存泄漏问题,只是可以做一些解决方法.

感谢你的帮助!



1> Ivan..:

我的假设是,您在JProfiler中收集分配信息/调用堆栈等,并且观察到的RSS增长与JProfiler将该数据保存在内存中有关。

您可以通过收集较少的信息来验证这是否是正确的(分析开始时应该有一个屏幕,允许您例如不收集对象分配),然后查看是否观察到RSS增长较小。也可以选择不使用JProfiler运行负载测试。

我过去也有类似的情况。

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有