【问题标题】:How to find which objects are creating the most garbage如何找出哪些对象产生的垃圾最多
【发布时间】:2014-03-07 16:42:04
【问题描述】:

我有一个包含 80 个不同类的大约 80 个实例的应用程序。这些类的某些子集产生的垃圾量是不可接受的,并且停止世界暂停时间太长,因为我的应用程序是实时的。

我想要找到的是哪些类负责在堆上创建最大的 数量 对象(不是聚合大小,而是对象的原始数量),因为这就是停止世界暂停的原因花了这么长时间。

我如何找到这个?

如果需要 JVisualVM,我有这个。

【问题讨论】:

  • If JVisualVM is required, I have this. 那么是什么阻止你使用它呢?
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 没有什么能阻止我使用 JVisualVM,就像没有什么能阻止我使用任何其他工具一样。问题是我不知道如何回答由最差的类(在这个工具或我过去使用的任何其他工具中)生成的对象数量的具体问题。
  • 您使用的是哪个 GC?哪个 Java 发行版和版本?世界停顿了多久?您的用例可接受的持续时间是多少?你是如何测量停止世界持续时间的?如果你只有 80 个实例,并且这个数字没有改变,那么根据定义,没有新的实例被创建,因此没有垃圾被创建......你能澄清你的意思吗?

标签: java performance garbage-collection heap-memory


【解决方案1】:

试试 JProfiler,至少有免费试用版。其中一个内存视图告诉您哪些类创建了最多的实例(以及有多少)。还可以使用记忆录音;开始记录,设置“标记”,运行您认为会产生垃圾的操作,停止记录,查看自设置“标记”以来哪些类创建的实例最多。基本上,你需要一个好的分析器,不管是哪一个。根据我的经验,通常商业的更好。

更新:一个好的分析器会准确地告诉你一个类有多少个实例。这听起来像你要求的。

【讨论】:

  • 你需要一个好的分析器......并且愿意去阅读它的文档并长时间试验它,看看你能用它做什么。
【解决方案2】:

查看每个类的对象数量的一种非常轻量级的方法是类直方图

只需通过jmap -histo <PID>生成类直方图。

使用-XX:+PrintClassHistogramBeforeFullGC-XX:+PrintClassHistogramAfterFullGC 在您的世界停止暂停发生时查看类直方图。您可以比较之前/之后的快照,以查看在 stop-the-world 暂停期间收集了哪些类实例。

Profiling number of garbage-collected object instances per class查看更多详情。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多