java - 在什么情况下,年轻一代的java垃圾回收会持续很长时间?

标签 java garbage-collection

昨天我们在一台 JBoss 应用服务器的服务器日志中有以下 GC 输出:

51628.286: [GC 51628.288: [ParNew: 1843200K->204800K(1843200K), 21.3196040 secs]
5177730K->3743415K(7987200K), 21.3217870 secs]
[Times: user=1.38 sys=0.33, real=21.32 secs] 

我这样理解输出:年轻一代的大小为 1843200K。生成前大小为1843200K,生成后大小为204800K。收集持续了 21.3 秒。

通常我们的年轻一代集合持续 <1 秒。 yg collections在什么情况下能维持这么久?

我们的 JVM 参数:

-server 
-verbose:gc
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails 
-XX:NewRatio=3
-XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC 
-XX:+UseCMSCompactAtFullCollection 
-XX:CMSInitiatingOccupancyFraction=60 
-XX:MaxPermSize=256m 
-Xss512k 
-Xms8000m 
-Xmx8000m

Java 版本:

java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)

谢谢, 马塞尔

最佳答案

我们有一个 tomcat 服务器,它的垃圾收集持续约 2 分钟。最终,我们找到了原因,我们通过 -Xmx 分配给 JVM 的内存比系统上的物理内存多。这会在垃圾收集期间导致分页,从而将其杀死。

此外,我们有多个虚拟机在同一台物理机器上运行。确保您分配给所有 VM 的内存没有超过服务器上的物理内存。

有关详细信息,请参阅 Tuning the Memory Management System, section Setting the Heap Size (我的重点):

Command line options: -Xms: -Xmx:

The heap size has an impact on allocation speed, garbage collection frequency and garbage collection times. A small heap will become full quickly and must be garbage collected more often. It is also prone to more fragmentation, making object allocation slower. A large heap introduces a slight overhead in garbage collection times. A heap that is larger than the available physical memory in the system must be paged out to disk, which leads to long access times or even application freezes, especially during garbage collection.

关于java - 在什么情况下,年轻一代的java垃圾回收会持续很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8168691/

相关文章:

java - 如何使用 ScheduledExecutorService 更改重复任务的速率或周期?

java - 如何以编程方式确定在 Java 中运行 x11 窗口的进程

.net - 检测是否调用了垃圾收集器(.Net)

Java面试题: finalize() method

java - Java GC 如何清理直接字节缓冲区,因为 IBM 文档说,确实如此。

java - 布局方向?

java - 无法从外部类访问 EAR 中定义的资源 (JBoss 5.1)

java - RxJava : observeOn, subscribeOn, and doFinally, IO和UI线程切换

java - 如何检查 Jetty 应用程序的内存使用情况并强制进行垃圾回收

java - finalize() 在 Java 中如何工作?