java垃圾收集器回调

时间:2016-02-16 16:44:47

标签: java performance garbage-collection

在使用jvisualvm定位性能问题时,我发现我的java应用程序(1000个类)在操作期间创建了大量临时对象(比如说X),这些对象在操作后只有少量对象(说Y)是可以复原的。 减少临时对象的数量可能会导致性能提升(创建,删除/ GC对象和RAM的CPU周期)。 缺少的信息是正在创建的类型或临时对象。我可以访问代码并尝试查找,但这将花费大量时间来跟踪所有代码流。

我能想到的另一种方法是让GC在日志中添加一条消息,说明正在释放哪种类型的对象,这将为我提供有关可能的罪魁祸首的提示。

java GC是否有提供此信息的工具?

3 个答案:

答案 0 :(得分:1)

我认为不可能从GC获取每个对象的日志记录或回调,但是您可以通过JMX以编程方式获取累积的统计信息。此article显示了如何从Oracle here记录的GarbageCollectorMXBean个实例中获取通知。

也许你在错误的一端剥了一根香蕉。您可以监视显示实时对象的内存快照,而不是专注于死对象的内容。您可以使用VisualVM动态执行此操作,或使用jmap实用程序保存内存转储。这将为您提供大量输入以优化您的内存配置文件。毕竟,您对GC监测的期望是什么?所有这一切都必须下降。所有活体物体在某些时候都会死亡。检查您的实时对象。

答案 1 :(得分:0)

您可以覆盖finalize()方法(more info)并在那里打印出一些信息。

  

当垃圾收集确定没有对该对象的更多引用时,由对象上的垃圾收集器调用。子类重写finalize方法以处置系统资源或执行其他清理。

答案 2 :(得分:0)

JDK有一个名为jmap的工具,它可以按类报告对象的分布 - 类直方图。它虽然是为活对象做的。

通过采用多类直方图并比较它们,可以通过死类构建类似的直方图。

我已经自动执行了这个过程,您可以使用sjk工具和hh命令为堆中的垃圾生成类直方图。

Here您可以找到更多详细信息。