在4核8GB的机器上,使用ParNew和CMS(Concurrent Mark-Sweep)垃圾收集器组合,并固定年轻代大小,同时考虑预留部分内存给操作系统,可以通过设置以下JVM启动参数来实现。
假设预留2GB内存给操作系统,那么JVM可以使用的最大堆内存为6GB。在这种情况下,可以配置年轻代为1.5GB。
JVM启动参数配置示例
java -Xms6g -Xmx6g -Xmn1.5g \
-XX:+UseParNewGC \
-XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=75 \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:+CMSParallelRemarkEnabled \
-XX:SurvivorRatio=8 \
-XX:MaxTenuringThreshold=10 \
-XX:+ExplicitGCInvokesConcurrent \
-XX:+CMSScavengeBeforeRemark \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=4 \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps \
-XX:+PrintHeapAtGC \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=10 \
-XX:GCLogFileSize=20M \
-Xloggc:/var/log/tomcat/gc.log
参数说明
-Xms6g: 设置JVM堆的初始大小为6GB。-Xmx6g: 设置JVM堆的最大大小为6GB。-Xmn1.5g: 设置年轻代大小为1.5GB。-XX:+UseParNewGC: 使用ParNew作为年轻代垃圾收集器。-XX:+UseConcMarkSweepGC: 使用CMS作为老年代垃圾收集器。-XX:CMSInitiatingOccupancyFraction=75: 当老年代使用率达到75%时触发CMS GC。-XX:+UseCMSInitiatingOccupancyOnly: 仅在达到CMSInitiatingOccupancyFraction的情况下触发CMS GC。-XX:+CMSParallelRemarkEnabled: 启用CMS并行标记阶段以减少停顿时间。-XX:SurvivorRatio=8: 设置Eden区和Survivor区的大小比率。表示Eden区的大小是Survivor区的8倍。-XX:MaxTenuringThreshold=10: 设置对象进入老年代前在Survivor区的最大年龄阈值。-XX:+ExplicitGCInvokesConcurrent: System.gc()调用将触发并发GC而不是完全停顿。-XX:+CMSScavengeBeforeRemark: 在CMS remark阶段之前进行一次年轻代GC。-XX:ParallelGCThreads=4: 设置用于垃圾收集的并行线程数,与CPU核心数一致。-XX:ConcGCThreads=4: 设置并发GC线程数,与CPU核心数一致。-XX:+PrintGCDetails: 打印GC详细信息。-XX:+PrintGCDateStamps: 打印GC日志的日期戳。-XX:+PrintGCTimeStamps: 打印GC日志的时间戳。-XX:+PrintHeapAtGC: 在每次GC之前和之后打印堆信息。-XX:+UseGCLogFileRotation: 启用GC日志文件轮转。-XX:NumberOfGCLogFiles=10: 保留GC日志文件的数量。-XX:GCLogFileSize=20M: 每个GC日志文件的大小。-Xloggc:/var/log/tomcat/gc.log: 指定GC日志文件的路径。
运行Java应用
将上述JVM启动参数应用于你的Java应用程序,以下是一个示例命令:
java -Xms6g -Xmx6g -Xmn1.5g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10 -XX:+ExplicitGCInvokesConcurrent -XX:+CMSScavengeBeforeRemark -XX:ParallelGCThreads=4 -XX:ConcGCThreads=4 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M -Xloggc:/var/log/tomcat/gc.log -jar your-application.jar
将 your-application.jar 替换为你的Java应用程序的实际JAR文件名。这样,你的Java应用程序将使用ParNew和CMS垃圾收集器组合,固定年轻代大小,并保留部分内存给操作系统。
在2核4GB的机器上,使用ParNew和CMS(Concurrent Mark-Sweep)垃圾收集器组合,并固定年轻代大小,同时预留一部分内存给操作系统,可以通过设置以下JVM启动参数来实现。
假设预留1GB内存给操作系统,那么JVM可以使用的最大堆内存为3GB。在这种情况下,可以配置年轻代为750MB。
JVM启动参数配置示例
java -Xms3g -Xmx3g -Xmn750m \
-XX:+UseParNewGC \
-XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=75 \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:+CMSParallelRemarkEnabled \
-XX:SurvivorRatio=8 \
-XX:MaxTenuringThreshold=10 \
-XX:+ExplicitGCInvokesConcurrent \
-XX:+CMSScavengeBeforeRemark \
-XX:ParallelGCThreads=2 \
-XX:ConcGCThreads=2 \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps \
-XX:+PrintHeapAtGC \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=10 \
-XX:GCLogFileSize=20M \
-Xloggc:/var/log/tomcat/gc.log
参数说明
-Xms3g: 设置JVM堆的初始大小为3GB。-Xmx3g: 设置JVM堆的最大大小为3GB。-Xmn750m: 设置年轻代大小为750MB。-XX:+UseParNewGC: 使用ParNew作为年轻代垃圾收集器。-XX:+UseConcMarkSweepGC: 使用CMS作为老年代垃圾收集器。-XX:CMSInitiatingOccupancyFraction=75: 当老年代使用率达到75%时触发CMS GC。-XX:+UseCMSInitiatingOccupancyOnly: 仅在达到CMSInitiatingOccupancyFraction的情况下触发CMS GC。-XX:+CMSParallelRemarkEnabled: 启用CMS并行标记阶段以减少停顿时间。-XX:SurvivorRatio=8: 设置Eden区和Survivor区的大小比率。表示Eden区的大小是Survivor区的8倍。-XX:MaxTenuringThreshold=10: 设置对象进入老年代前在Survivor区的最大年龄阈值。-XX:+ExplicitGCInvokesConcurrent: System.gc()调用将触发并发GC而不是完全停顿。-XX:+CMSScavengeBeforeRemark: 在CMS remark阶段之前进行一次年轻代GC。-XX:ParallelGCThreads=2: 设置用于垃圾收集的并行线程数,与CPU核心数一致。-XX:ConcGCThreads=2: 设置并发GC线程数,与CPU核心数一致。-XX:+PrintGCDetails: 打印GC详细信息。-XX:+PrintGCDateStamps: 打印GC日志的日期戳。-XX:+PrintGCTimeStamps: 打印GC日志的时间戳。-XX:+PrintHeapAtGC: 在每次GC之前和之后打印堆信息。-XX:+UseGCLogFileRotation: 启用GC日志文件轮转。-XX:NumberOfGCLogFiles=10: 保留GC日志文件的数量。-XX:GCLogFileSize=20M: 每个GC日志文件的大小。-Xloggc:/var/log/tomcat/gc.log: 指定GC日志文件的路径。
运行Java应用
将上述JVM启动参数应用于你的Java应用程序,以下是一个示例命令:
java -Xms3g -Xmx3g -Xmn750m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10 -XX:+ExplicitGCInvokesConcurrent -XX:+CMSScavengeBeforeRemark -XX:ParallelGCThreads=2 -XX:ConcGCThreads=2 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M -Xloggc:/var/log/tomcat/gc.log -jar your-application.jar
将 your-application.jar 替换为你的Java应用程序的实际JAR文件名。这样,你的Java应用程序将使用ParNew和CMS垃圾收集器组合,固定年轻代大小,并保留部分内存给操作系统。