我有一个包含80个不同类的大约80个实例的应用程序。由于我的应用程序是实时的,因此这些类的某些子集生成的垃圾量是不可接受的并且停止世界暂停太长时间。
我想要找到的是哪些类负责在堆上创建最大的 number 对象(不是聚合大小,而是原始对象数),因为这是导致世界暂停的原因花了这么久。
我如何找到这个?
如果需要JVisualVM,我就有了。
答案 0 :(得分:2)
试试JProfiler,至少有一个免费试用版。其中一个内存视图告诉您哪些类创建的实例最多(以及有多少)。你也可以使用记忆录音;开始录制,设置“标记”,运行您认为创建垃圾的操作,停止录制,查看自设置“标记”以来哪些类创建的实例最多。基本上,你需要一个好的剖析器,无论哪一个都没关系。根据我的经验,通常商业广告更好。
更新:一个好的分析器会告诉你确切存在多少个类的实例。这听起来像你要求的。
答案 1 :(得分:2)
一种非常轻量级的方法来查看每个类的对象数量类直方图。
只需按jmap -histo <PID>
生成类直方图。
使用-XX:+PrintClassHistogramBeforeFullGC
,-XX:+PrintClassHistogramAfterFullGC
查看停止世界暂停时的班级直方图。您可以比较之前/之后的快照,以查看在停止世界暂停期间收集的类实例。
在Profiling number of garbage-collected object instances per class中查看更多详情。