Optimization JAVA GC-在次要GC之后收集的顶级类

Optimization JAVA GC-在次要GC之后收集的顶级类,optimization,garbage-collection,jvm,Optimization,Garbage Collection,Jvm,这些天来,我们一直在监控我们实验室的一项应用。我们发现小GC经常发生,总GC时间约为20分钟15秒 与另一家公司的类似产品相比,我们测量的总GC时间约为8秒 我们想知道代码的哪一部分会导致频繁的对象分配和回收,这样我们就可以优化我们的代码并尽可能赶上其他人 我们尝试使用jvisualvm创建堆转储,并查看两个堆转储之间的差异。但是,创建堆转储的时间很难处理,而且创建速度也很慢 是否有任何工具或方法可以知道在每个次要GC期间收集最多的类 谢谢大家! jmc、jprofiler或yourkit等ja

这些天来,我们一直在监控我们实验室的一项应用。我们发现小GC经常发生,总GC时间约为20分钟15秒

与另一家公司的类似产品相比,我们测量的总GC时间约为8秒

我们想知道代码的哪一部分会导致频繁的对象分配和回收,这样我们就可以优化我们的代码并尽可能赶上其他人

我们尝试使用jvisualvm创建堆转储,并查看两个堆转储之间的差异。但是,创建堆转储的时间很难处理,而且创建速度也很慢

是否有任何工具或方法可以知道在每个次要GC期间收集最多的类


谢谢大家!

jmc、jprofiler或yourkit等java分析器提供了分配记录或类直方图差异,这应该告诉您哪些类经常被分配。有些人甚至可以告诉你分配地点

或者,您可以尝试调整GC以减少收集年轻一代的频率(通过使其变大或放宽暂停时间目标),这可能会提高效率

总GC时间占运行时间的比例相对较大


这很奇怪。它通常会触发超出OOME的GC开销限制,至少对于并行收集器是默认的。

您在GC统计中是否看到任何显式GC调用???@harshavmb显式GC调用意味着什么?当我们使用jvisualvm进行监控时,我们发现次要GC频繁发生,总次要GC时间约为20分钟14秒,我们需要对代码进行一些更改。显式GC调用是应用程序对jvm调用GC的调用。可以使用方法System.gc()调用它;或Runtime.getRuntime().gc();。次要gc调用用于清除位于Eden空间中的年轻一代对象。这应该不是问题,主要gc暂停其他正在运行的线程的执行,这才是真正的问题。我只想检查gc调用是隐式的(jvm内部调用)还是显式的(应用程序调用jvm来调用jvm)。20分钟内15秒的gc暂停(墙时间?CPU时间?)实际上并没有那么多。只有1.25%。即使把你的GC时间减少一半也只能使它快0.5%。非常感谢。也许我说得不够清楚。你能看一下我的更新吗?我们希望在调优gc之前改进我们的应用程序。