javaweb
javaweb copied to clipboard
jvm参数
编译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=
-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=
-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