java - 如何找到哪个Finalizer耗时

标签 java garbage-collection jvm finalizer finalize

我正在开发一个应用程序,其目的是尽可能快地计算报告。

我的应用程序使用了大量内存;超过 100 个 Go。

自上次发布以来,我注意到性能大幅下降。我的调查显示,在计算过程中,我在 40 到 60 秒之间进行了多次垃圾回收!!! (JMC 告诉我它们是 SerialOld 但我不知道它到底是什么意思) 当然,当 JVM 进行垃圾收集时,应用程序会完全卡住

我现在正在调查这些垃圾收集的来源......这是一项非常艰苦的工作。

我怀疑,如果这些垃圾回收这么长,那是因为它们在 finalize 函数中花费了很多时间 (我知道,在我们从其他团队集成的所有库中,其中一些使用终结器)

但是,我不知道如何确认(或不确认)这个假设;如何找到哪个终结器很耗时。

我正在寻找一个好的工具,甚至是一个好的方法论

Here is data collected via JVisualVM Taken from JVisualVM's "Tracer" tab

As you can see, I always have many "Pending Finalizers" when I have a log Old Garbage

What is surprising is that when I am using JVisualVM, the above graph scrolls regularly from right to left. When the Old Garbage is triggered, the scrolling stops (until here, it looks normal, this is end-of-world). However, when the scrolling suddenly restart, it does not from the end of Old Garbage but from the end of Pending Serializer

This lets me think that the finalizers were blocking the JVM

Does anyone has an explaination for this?

非常感谢 菲利普

最佳答案

My application uses a big amount of memory; more than 100 Go.

JMC tells me that they are SerialOld but I don't know what it exactly means

如果您将串行收集器用于 100GB 的堆,那么长时间停顿是意料之中的,因为串行收集器是单线程的,一个内核每单位时间只能消耗这么多内存。

简单地选择任何一个多线程收集器应该会产生更短的暂停时间。

However, I don't know how to confrim (or not) this hypothesis; How to find which finalizer is time consuming.

通常:收集更多数据。对于与 GC 相关的事情,您需要启用 GC 日志记录,对于花在 Java 代码(无论是您的应用程序还是第 3 方库)上的时间,您需要一个分析器。

关于java - 如何找到哪个Finalizer耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562665/

相关文章:

java - 通过直接更改 FormData keyVals 的列表 jsoup 来更改 FormElement 的信息

javascript - 浏览器的 JavaScript 垃圾回收是如何工作的?

javascript - 当您不再持有对 ES6-Promise 的引用时,ES6-Promise 会发生什么?

java - Java中位置的无效内存访问

java - Android loopj Async Http 在 1.4.5 更新后崩溃

java - 如何查找哪个父对象创建了子对象

java - Ant 构建文件还包含 derby 数据库 jar

c# - 如何测试对象是否被处置和 GC'ed?

java - 在运行 JUnit 测试时测量内存消耗的方法

java - 是否应该为每个线程创建一个新对象?