通常jvm相关的配置都是复制粘贴直接用,做为一名开发,对自己的系统配置要知根知底,这样有问题时才不慌,如下是我们生产项目的jvm相关参数配置,解读一下。
JAVA_OPTS: "-Dcsp.sentinel.log.dir=/data/log/k8s_$(POD_NAME)_$(ITWORK_ENV_CODE)_$(HOST_IP)_$(POD_IP)\
\ -Xmx2g -Xms2g -Xss1m -XX:+UseG1GC -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m\
\ -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=200\
\ -XX:InitiatingHeapOccupancyPercent=45 -Dspring.application.registry.tag=SH\
\ -Dspring.application.target.tag=SH -Dcurrent.application.name=business-coupon\
\ -DCONFIG_PROPERTIES_FILE=config-online.properties -Dspring.cloud.consul.host=$(HOST_IP)\
\ -Dspring.cloud.consul.discovery.tags[0]=env=online -DPOD_NAME=$(POD_NAME)\
\ -DITWORK_ENV_CODE=$(ITWORK_ENV_CODE) -DHOST_IP=$(HOST_IP) -DPOD_IP=$(POD_IP)\
\ -Dlog4j.ignoreTCL=true -Dspring.profiles.active=PRO"
参数说明:
-X : non-standard非标准参数,即不是jvm虚拟机规范中指定的,并不是所有类型虚拟机都会支持,但hotspot支持
-XX : not-stable 不稳定的参数,后期可能会变的
-D: jvm启动时给系统参数赋值用的(可以是系统默认有的参数,也可以是自己定义的参数
-Dcsp.sentinel.log.dir 限流日志路径 ,$中的都是实例中的环境变量
-Xmx2g jvm最大堆内存
-Xms2g jvm最小堆内存,最大与最小设置为一样,避免在cpu负载较高时还要分担资源给jvm去处理堆空间相关问题
-Xss1m 控制每个线程的Stack Space(堆栈)的大小,堆栈在“虚拟机栈”中,所以这个与-Xmx,-Xms大小无关,线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误.此处采用默认值1m
-XX:+UseG1GC 指定所用垃圾回收器为G1
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m 给元空间分配的空间为512m,如果不设置这个-XX:MaxMetaspaceSize,元空间不够后会进行fullGc,然后自动给元空间扩容一倍。
-XX:ParallelGCThreads=8 表示的是GC并行时使用的线程数,这个参数在设置时与cpu核数有很大关系,ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8) (默认情况下,JVM会在机器的每个CPU上运行一个线程,最多同时运行8个。一旦达到这个上限,JVM会调整算法,每超出5/8个CPU启动一个新的线程)
-XX:ConcGCThreads=8 表示GC并行时使用的线程数,那与-XX:ParallelGCThreads有甚区别呢? 具体说就是在垃圾回收生命周期中作用的阶段不一样,官方解释:ParallelGCThreads option affects the number of threads used for phases when application threads are stopped, and the ConcGCThreads flag affects the number of threads used for concurrent phases. 个人理解就是ParallelGCThreads 作用于stw初始标记阶段,ConcGCThreads使用于并发标记阶段,如下图
-XX:MaxGCPauseMillis=50 为所需的最长暂停时间设置目标值。默认值是 200 毫秒。这个数值是一个软目标,也就是说JVM会尽一切能力满足这个暂停要求,但是不能保证每次暂停一定在这个要求之内。根据测试发现,如果我们将这个值设定成50毫秒或者更低的话,JVM为了达到这个要求会将年轻代内存空间设定的非常小,从而导致youngGC的频率大大增高。建议不要设置。
-XX:GCPauseIntervalMillis=200 指定最短多长可以进行一次gc
-XX:InitiatingHeapOccupancyPercent 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。就是说当使用内存占到堆总大小的45%的时候,G1将开始并发标记阶段。
其它demo
-server
-Xms4g
-Xmx4g
-XX:MetaspaceSize=400m
-XX:MaxMetaspaceSize=400m
-XX:NewSize=3g
-XX:MaxNewSize=3g
-XX:SurvivorRatio=18
-XX:+UseParNewGC
-XX:ParallelGCThreads=4
-XX:MaxTenuringThreshold=5
-XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=60
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=1
-XX:+CMSClassUnloadingEnabled
-XX:+ExplicitGCInvokesConcurrent
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC
-Xloggc:/export/Logs/tomcat8-gc.log
-Dcom.sun.management.jmxremote.port=1089
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder