javaweb icon indicating copy to clipboard operation
javaweb copied to clipboard

jvm参数

Open www1350 opened this issue 7 years ago • 0 comments

编译jdk hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/ cd jdk8u chmod 755 get_source.sh ./get_source.sh

brew install llvm brew freetype

-XX:+UseCompressedOops 普通对象指针压缩 (默认由虚拟机的Ergonomics机制自动开启)

-XX:+HeapDumpOnOutOfMemoryError 虚拟机出现内存溢出异常时Dump当前内存堆转储快照

-XX:HeapDumpPath=java.hprof

-XX:+UseSerialGC Serial收集器.新生代收集器。

-XX:+ UseSerialOldGC SerialOld是Serial收集器的老年代收集器版本,它同样是一个单线程收集器

-XX:+UseParNewGC ParNew其实就是Serial收集器的多线程版本.新生代收集器。

-XX:+UseParallelGC 并行垃圾回收器ParallelScavenge.新生代收集器。使用Parallel收集器+ 老年代串行

-XX:+UseParallelOldGC ParallelOld是并行收集器,和SerialOld一样,ParallelOld是一个老年代收集器。使用Parallel收集器+ 老年代并行

-XX:+UseConcMarkSweepGC 并发标记扫描垃圾回收器,CMS是一个老年代收集器,全称 Concurrent Low Pause Collector

-XX:ParallelGCThreads 限制线程数量

-XX:ParallelCMSThreads=n 并发标记扫描垃圾回收器 =为使用的线程数量

-XX:+UseG1GC G1垃圾回收器

-Xms 初始化堆内存大小

-Xmx 堆内存最大值

-Xmn 新生代大小

-XX:PermSize 初始化永久代大小

-XX:MaxPermSize 永久代最大容量

-XX:MaxGCPauseMills 最大停顿时间,单位毫秒。GC尽力保证回收时间不超过设定值

-XX:GCTimeRatio 0-100的取值范围,垃圾收集时间占总时间的比,默认99,即最大允许1%时间做GC

-XX:MaxGCPauseMillis 控制最大垃圾收集停顿时间

-XX:CMSInitiatingOccupancyFraction=68 (默认是 68) 当堆满之后,并行收集器便开始进行垃圾收集,例如,当没有足够的空间来容纳新分配或提升的对象。对于CMS收集器,长时间等待是不可取的,因为在并发垃圾收集期间应用持续在运行(并且分配对象)。因此,为了在应用程序使用完内存之前完成垃圾收集周期,CMS收集器要比并行收集器更先启动。

老年代达到70%CMS开始执行垃圾回收。CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。比如应用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还剩10%的空间是550010%=550兆,所以即使Xmn(也就是年轻代共500兆)里所有对象都搬到年老代里,550兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的promotion failed;

CMS的另一个缺点是它需要更大的堆空间。因为CMS标记阶段应用程序的线程还是在执行的,那么就会有堆空间继续分配的情况,为了保证在CMS回 收完堆之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说,CMS不会在老年代满的时候才开始收集。相反,它会尝试更早的开始收集,已 避免上面提到的情况:在回收完成之前,堆没有足够空间分配!默认当老年代使用68%的时候,CMS就开始行动了。 – XX:CMSInitiatingOccupancyFraction =n 来设置这个阀值。

因为不同的应用会有不同对象分配模式,JVM会收集实际的对象分配(和释放)的运行时数据,并且分析这些数据,来决定什么时候启动一次CMS垃圾收集周期。为了引导这一过程, JVM会在一开始执行CMS周期前作一些线索查找。该线索由 -XX:CMSInitiatingOccupancyFraction=来设置,该值代表老年代堆空间的使用率。比如,value=75意味着第一次CMS垃圾收集会在老年代被占用75%时被触发。通常CMSInitiatingOccupancyFraction的默认值为68(之前很长时间的经历来决定的)。

-XX:+UseCMSInitiatingOccupancyOnly

我们用-XX+UseCMSInitiatingOccupancyOnly标志来命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期。而是,当该标志被开启时,JVM通过CMSInitiatingOccupancyFraction的值进行每一次CMS收集,而不仅仅是第一次。然而,请记住大多数情况下,JVM比我们自己能作出更好的垃圾收集决策。因此,只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。

老年代碎片严重问题:(1)如果频率太快或者 Full GC 后空间释放不多的话,说明空间不足,首先可以尝试调大老年代空间(2)如果内存不足,可以设置进行 n 次 CMS 后进行一次压缩式 Full GC,参数如下:

-XX:+UseCMSCompactAtFullCollection:允许在 Full GC 时,启用压缩式 GC

-XX:CMSFullGCBeforeCompaction=n 在进行 n 次,CMS 后,进行一次压缩的 Full GC,用以减少 CMS 产生的碎片

-XX:+UseAdaptiveSizePolicy GCTimeRatio的值是一个大于0小于100的整数,也就是垃圾收集时间占总时间的比率。默认为99,则允许最大GC时间就占总时间的1%(1/(1+99)).还有一个参数,-XX:+UseAdaptiveSizePolicy,是个开关参数,打开后会自动调整Eden/Survivor比例,老年代对象年龄,新生代大小等。这个参数也是Parallel Scavenge和ParNew的重要区别。

-XX:+PrintGC 输出GC日志

-XX:+PrintGCDetails 输出GC的详细日志

-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

-Xloggc:../logs/gc.log 日志文件的输出路径

-XX:+PrintTenuringDistribution的输出显示在survivor空间里面有效的对象的岁数情况。 -XX:+PrintTenuringDistribution输出的方式是观察在每一个岁数上面,对象的存活的数量,以及其增减情况,以及HotSpot VM计算的任期阀值是不是等于或者近似于设定的最大任期阀值

-XX:+UseTLAB 启用TLAB(JVM在内存新生代Eden Space中开辟了一小块线程私有的区域,称作TLAB <Thread-local allocation buffer>,哪个线程需要分配内存,就在哪个线程TLAB上分配)机制的意思

-XX:TLABSize= 设置大小,也就是本地线程中的私有区域大小(只有这个区域放不下才会到Eden中去申请)。

-XX:+ResizeTLAB 是否启动动态修改

-XX:+PrintTLAB 可以输出TLAB的内容。

-XX:NewRatio 默认为2 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio 默认为8 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

www1350 avatar Aug 15 '17 16:08 www1350