大白话:
1.秒杀场景,Eden会设置的比较大;
2.FullGC是代价最高的GC,频率越低越好。
大白话:
一般情况下,设置JVM堆内存为物理机内存的一半,最大不超过3/4;
-Xmn3072M - 设置新生代的内存大小,如果不是秒杀系统,一般可以调整为1G或2G;
-Xss1M - 设置单个线程栈大小,一般默认512~1024kb,单个线程栈大小跟操作系统和JDK版本都有关系,设置1M、2M。
-XX:PermSize=256M - 设置永久代初始内存大小,永久代大小的设置,跟你是什么应用(比如秒杀系统)没有多大关系,因为永久代是装载类文件的,一般设置256/512M就可以;
-XX:MaxPermSize=256M - 设置永久代最大内存大小;
-XX:+UseParNewGC - 新生代启用ParNew垃圾收集器;
-XX:+UseConcMarkSweepGC - 老年代启用CMS垃圾收集器;
-XX:CMSInitiatingOccupancyFaction=92 -老年代触发FullGC的阈值;
-XX:+UseCMSCompactAtFullCollection - 众所周知CMS垃圾收集会存在碎片化问题,该参数作用让FullGC之后做压缩整理(减少碎片);
-XX:CMSFullGCsBeforeCompaction=0 - 多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次,如果设置为2,则表示2次FullGC后,才会进行一次压缩整理;
-XX:+CMSParallelInitialMarkEnabled - 启动并发标记,在初始标记阶段,会STW,导致服务中断,这个时候怎么办呢,一种方式是将初始标记阶段变为多线程,减少初始标记阶段停顿时间;
-XX:+CMSScavengeBeforeRemark - 在重新标记阶段,会STW,导致服务中断,这个时候,在执行重新标记前,先执行一次YGC,因为重新标记主要管的是新创建的对象(新生代),先执行一次YGC,新生代中的垃圾对象都会被提前清除掉,这样再扫描对象,对象就会少很多,从而降低STW停顿时间。
正常情况下,还可以设置一些其他参数,比如日志输出等等。
大白话:
-Xloggc:/home/shared/log/gc-server.log - 保存gc日志;
-XX:ParallelGCThread=2 - GC并发线程数量,一般默认8,如果对垃圾回收要去不高,可以降低线程数量;
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=128M - 元数据空间不能太大,太大会把整个系统内存占满,一般需要做下限制,设置64/128/256都是可以的;
-XX:UseFastAccessorMethods - 开关,访问Java类的时候,可以通过快速访问器访问Java方法,简单理解就是不通过get/set方法去访问,get/set方法太多会影响执行效率,这个时候,可以不通过get/set方法访问,可以直接去访问字段,不过在JDK11后被取消了,所以这个参数不是特别重要;
-XX:+PrintGCDetails - 打印GC的详细信息;
-XX:+PrintGCApplicationStoppedTime - 打印GC服务停止时间;
-XX:+PrintGCDateStamps - 打印GC时间戳;
-XX:+PrintHeapAtGC - 在进行GC的前后打印出堆的信息;
-XX:+UseGCLogFileRotation - 开启滚动生成日志;
-XX:+NumberOfGCLogFiles=10 - 滚动GC日志文件数,默认0不滚动;
-XX:GCLogFileSize=50M - GC文件滚动大小,需开启UseGCLogFileRotation;
-XX:HeapDumpOnOutMemoryError - 发生OOM时,dumpJVM堆栈信息;
-XX:HeapDumpPath=/usr/local/oom - dump的堆栈信息保存路径;