Java 垃圾收集的哪一部分需要时间?

Java 垃圾收集的哪一部分需要时间?,java,performance,garbage-collection,Java,Performance,Garbage Collection,我正在调查Java应用程序中的性能问题。我们已经将范围缩小到周期性的非常昂贵的垃圾收集。该应用程序执行非常频繁的YoungGen垃圾收集(频率略高于每分钟一次),但通常低于0.5秒。然而,有时我们会遇到一两个小时的收集时间超过20秒,在某些情况下甚至高达160秒。分析gc日志,除了长的总时间外,在这些情况下似乎有所不同的是,在内核模式下花费的时间要大得多(sys time的值很大) 什么导致在内核模式下花费时间?服务器运行的是Java 1.6.045,具有-Xms5704m-Xmx5704m和-

我正在调查Java应用程序中的性能问题。我们已经将范围缩小到周期性的非常昂贵的垃圾收集。该应用程序执行非常频繁的YoungGen垃圾收集(频率略高于每分钟一次),但通常低于0.5秒。然而,有时我们会遇到一两个小时的收集时间超过20秒,在某些情况下甚至高达160秒。分析gc日志,除了长的总时间外,在这些情况下似乎有所不同的是,在内核模式下花费的时间要大得多(sys time的值很大)


什么导致在内核模式下花费时间?服务器运行的是Java 1.6.045,具有
-Xms5704m-Xmx5704m
-XX:+UseParallelOldGC

这样大的堆,需要长时间的完整GC。您可以尝试使用并发标记和扫描,因为您的分配率似乎不太高(每分钟一次并不多)

关于ConcMarkAndSweepGC:

至于问题,什么需要时间。在GC期间,可能会与内核和内核内存系统发生交互


如果系统时间非常高,请确保未进行磁盘交换!!!物理内存不足对于java来说是不可能的,因为GC需要周期性地迭代所有分配的对象,所以如果内存区域被交换到磁盘,GC暂停可能会持续几分钟。最好是完全关闭交换。

这取决于旧版本中的内容。并行GC不适合5gb堆。如果你签入visualGC,你可能会有大约1.5gb的年轻空间,大约500mbsw的幸存者空间和大约3.2GB的旧空间

清除3.2 gb内存确实需要时间。根据你在应用程序中使用的长寿对象的类型,这一次可能会很高。使用同时标记和扫描的CMS收集器。这将有助于你的应用程序。如果可能,将这些设置与CMS colelctor-XX:-UseAptiveSizePolicy-XX:+UseTLAB-XX:ConcGCThreads=12一起使用


这些应该会给你的应用带来一个很好的提升,尽管GC时间现在并没有多大意义,因为停止世界清理会更少。

你的问题是什么时候通常花在内核模式上?还有,你在使用哪个JRE?@Chandranshu:是的,GC期间系统时间长的原因。我们正在运行Oracle JRE。