生产环境某服务JVM虚拟机参数设置备忘。
目录
01 使用的 GC 垃圾回收器:CMS
- CMS全称 Concurrent Mark Sweep
- 标记-清除算法的垃圾回收器
- 使用场景:GC 过程短暂停,适合对时延要求较高的服务,用户线程不允许长时间的停顿。
- 缺点:服务长时间运行,造成严重的内存碎片化。另外,算法实现比较复杂(如果也算缺点的话)
- 实现机制:根据 GC 的触发机制分为:周期性Old GC(被动)和主动Old GC
02 JVM 参数设置备忘
(注:信息已脱敏)
"-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties",
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
"-Duser.timezone=GMT+08",
"-Xms3840m",
"-Xmx3840m",
"-XX:NewSize=1024m",
"-XX:MaxNewSize=1024m",
"-XX:MaxDirectMemorySize=256m",
"-XX:MetaspaceSize=128m",
"-XX:MaxMetaspaceSize=256m",
"-XX:+UseParNewGC",
"-XX:+UseCMSInitiatingOccupancyOnly",
"-XX:+UseGCLogFileRotation",
"-XX:NumberOfGCLogFiles=10",
"-XX:GCLogFileSize=1024M",
"-XX:+ExplicitGCInvokesConcurrent",
"-XX:-UseGCOverheadLimit",
"-XX:+UseConcMarkSweepGC",
"-XX:CMSInitiatingOccupancyFraction=65",
"-XX:CMSFullGCsBeforeCompaction=2",
"-XX:+PrintGCDetails",
"-XX:+PrintGCTimeStamps",
"-XX:+PrintGCDateStamps",
"-javaagent:/usr/local/apm_agent/apm.agent.bootstrap.jar",
"-Xloggc:/data/logs/xxx.xxx_gc.log",
"-Dapm.applicationName=xxx",
"-Dapm.agentId=xxxip-xxxport",
"-Dapm.env=product",
"-Djava.endorsed.dirs=/usr/local/tomcat/endorsed",
"-Dcatalina.base=/usr/local/tomcat",
"-Dcatalina.home=/usr/local/tomcat",
"-Djava.io.tmpdir=/usr/local/tomcat/temp"
03 参数设置说明
//设置初始 Java™ 堆大小。最小大小为 1 MB。
"-Xms3840m",
//-Xmx 选项用于设置最大 Java™ 堆大小。
"-Xmx3840m",
//设置年轻代初始值
"-XX:NewSize=1024m",
//设置年轻代最大值
"-XX:MaxNewSize=1024m",
//直接内存.指定DirectMemory容量,若未指定,则默认与Java堆最大值一样。
//每个进程能使用的内存大小受操作系统的限制,在堆等的内存大小不变时,配置的栈内存越小,能开启的线程数越多。
"-XX:MaxDirectMemorySize=256m",
//【方法区】初始空间大小,达到该值就会触发垃圾收集器进行类型卸载。
// 同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放
// 了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
"-XX:MetaspaceSize=128m",
//【方法区】最大空间,默认没有限制。
"-XX:MaxMetaspaceSize=256m",
/*
如果是布尔类型的选项,它的格式为-XX:+flag或者-XX:-flag,分别表示开启和关闭该选项。
设置年轻代为多线程收集。可与CMS收集同时使用。在serial基础上实现的多线程收集器。
*/
"-XX:+UseParNewGC",
/*
指定HotSpot VM总是使用-XX:CMSInitiatingOccupancyFraction的值作为old的空间使用率限制来启动CMS垃圾回收。
如果没有使用-XX:+UseCMSInitiatingOccupancyOnly,那么HotSpot VM只是利用这个值来启动第一次CMS垃圾回收,
后面都是使用HotSpot VM自动计算出来的值。
*/
"-XX:+UseCMSInitiatingOccupancyOnly",
//启用GC日志文件的自动转储
"-XX:+UseGCLogFileRotation",
//GC日志文件的循环数目
"-XX:NumberOfGCLogFiles=10",
//控制GC日志文件的大小
"-XX:GCLogFileSize=1024M",
//如果在代码里面显式调用System.gc(),那么它还是会执行Full //GC从而导致用户线程被暂停。采用这个选项使得显式触发GC的时候还是使用CMS收集器。
"-XX:+ExplicitGCInvokesConcurrent",
//默认启用。限制GC的运行时间。如果GC耗时过长,就抛OOM。这里是对这个参数进行了关闭。
"-XX:-UseGCOverheadLimit",
//启用CMS低停顿垃圾收集器,减少FGC的暂停时间。
"-XX:+UseConcMarkSweepGC",
/*
指定了CMS垃圾回收时old代的空间占用率该是什么值.
希望old代占用率是65%的时候,启动CMS垃圾回收,你可以设置-XX:CMSInitiatingOccupancyFraction=65.
*/
"-XX:CMSInitiatingOccupancyFraction=65",
//设置多少次full gc后进行内存压缩,由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",
//使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理。
"-XX:CMSFullGCsBeforeCompaction=2",
//打印gc详细信息
"-XX:+PrintGCDetails",
//记录的是jvm启动时间为起点的相对时间
"-XX:+PrintGCTimeStamps",
//记录的是系统时间
"-XX:+PrintGCDateStamps",
//在加载java文件之前做拦截把字节码做修改
"-javaagent:/usr/local/apm_agent/apm.agent.bootstrap.jar",
//日志文件的输出路径
"-Xloggc:/data/logs/xxx.xxx_gc.log",
//apm的参数
"-Dapm.applicationName=xxx",
"-Dapm.agentId=xxxip-xxxport",
"-Dapm.env=product",
//-D 设置系统参数
"-Djava.endorsed.dirs=/usr/local/tomcat/endorsed",
"-Dcatalina.base=/usr/local/tomcat",
"-Dcatalina.home=/usr/local/tomcat",
"-Djava.io.tmpdir=/usr/local/tomcat/temp"
"-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties",
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
"-Duser.timezone=GMT+08",