在使用jvisualvm定位性能问题时,我发现我的java应用程序(1000个类)在操作期间创建了大量临时对象(比如说X),这些对象在操作后只有少量对象(说Y)是可以复原的。 减少临时对象的数量可能会导致性能提升(创建,删除/ GC对象和RAM的CPU周期)。 缺少的信息是正在创建的类型或临时对象。我可以访问代码并尝试查找,但这将花费大量时间来跟踪所有代码流。
我能想到的另一种方法是让GC在日志中添加一条消息,说明正在释放哪种类型的对象,这将为我提供有关可能的罪魁祸首的提示。
java GC是否有提供此信息的工具?
答案 0 :(得分:1)
我认为不可能从GC获取每个对象的日志记录或回调,但是您可以通过JMX以编程方式获取累积的统计信息。此article显示了如何从Oracle here记录的GarbageCollectorMXBean
个实例中获取通知。
也许你在错误的一端剥了一根香蕉。您可以监视显示实时对象的内存快照,而不是专注于死对象的内容。您可以使用VisualVM
动态执行此操作,或使用jmap
实用程序保存内存转储。这将为您提供大量输入以优化您的内存配置文件。毕竟,您对GC监测的期望是什么?所有这一切都必须下降。所有活体物体在某些时候都会死亡。检查您的实时对象。
答案 1 :(得分:0)
您可以覆盖finalize()
方法(more info)并在那里打印出一些信息。
当垃圾收集确定没有对该对象的更多引用时,由对象上的垃圾收集器调用。子类重写finalize方法以处置系统资源或执行其他清理。
答案 2 :(得分:0)