Java 爪哇:频繁出现“尖峰”;“已用内存”;图表

Java 爪哇:频繁出现“尖峰”;“已用内存”;图表,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,有一段时间,我的Java应用程序出现性能问题,我使用JavaMelody进行评测,不寻常的是“使用内存”图。它有很多短尖峰,似乎达到了~8GB的速度,据我所知,GC正在清理内存。有人有跟踪这些尖峰的经验吗?似乎他们指出了一些具体的问题 GC和JVM配置为: -XX:PermSize=384m -XX:MaxPermSize=512m -XX:+UseCompressedOops -XX:+使用FastAccessorMethods -XX:+CMSClassUnloadingEnabled -X

有一段时间,我的Java应用程序出现性能问题,我使用JavaMelody进行评测,不寻常的是“使用内存”图。它有很多短尖峰,似乎达到了~8GB的速度,据我所知,GC正在清理内存。有人有跟踪这些尖峰的经验吗?似乎他们指出了一些具体的问题

GC和JVM配置为: -XX:PermSize=384m -XX:MaxPermSize=512m -XX:+UseCompressedOops -XX:+使用FastAccessorMethods -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-UseParallelOldGC -XX:-使用自适应策略 -XX:surviviorratio=128 -XX:NewSize=4055m -XX:MaxNewSize=4055m -XX:+UseConMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+仅使用CMSINITIATING职业 -Xms12888m -Xmx12888m -Dsun.rmi.dgc.client.gcInterval=1800000 -Dsun.rmi.dgc.server.gcInterval=1800000

图表为(绿色表示“平均值”,蓝色表示“最大值”):

直到8:00,系统中没有负载


8:00之后,它处于加载状态,但不是很大的一个(~20个并发操作)

这看起来像是在Eden空间中分配对象,这是JVM的正常操作。我建议您使用内存分析器(如Flight Recorder)来了解分配率,并查看是否有任何方法可以降低分配率

特别是,如果您每隔几秒钟多次垃圾收集,我会尝试减少您正在创建的垃圾量。如果它比这个长,则取决于您的用例是否重要

如果您最近没有做过内存配置文件,我建议您这样做,只是为了获得应用程序的不同视图。我发现即使性能不是问题,查找bug也很有用

-XX:surviviorratio=128

这是相当高的,表明你有很多非常短暂的对象。这些可能很容易优化


我最近在纽约为一个客户开发了一个规则引擎,通过花一天时间降低分配率,我们将其性能提高了2.3倍。通过在CPU上花费第二天时间,我们将吞吐量提高了4倍。

这看起来像是在Eden空间中分配对象,这是JVM的正常操作。我建议您使用内存分析器(如Flight Recorder)来了解分配率,并查看是否有任何方法可以降低分配率

特别是,如果您每隔几秒钟多次垃圾收集,我会尝试减少您正在创建的垃圾量。如果它比这个长,则取决于您的用例是否重要

如果您最近没有做过内存配置文件,我建议您这样做,只是为了获得应用程序的不同视图。我发现即使性能不是问题,查找bug也很有用

-XX:surviviorratio=128

这是相当高的,表明你有很多非常短暂的对象。这些可能很容易优化


我最近在纽约为一个客户开发了一个规则引擎,通过花一天时间降低分配率,我们将其性能提高了2.3倍。通过在CPU上花费第二天的时间,我们将吞吐量提高了4倍。

确实发生了泄漏,创建了太多的对象。生存率也太高了。谢谢事实上,有一个漏洞,创造了太多的对象。生存率也太高了。谢谢