jvm垃圾回收器

Source

相关jvm参数

堆初始大小:-Xms
堆最大大小:-Xmx 或者 -XX:MaxHeapSize=size
新生代大小:-Xmn(-Xmn表示最大和初始大小都是这个) 或者 (-XX:NewSize=size and -XX:MaxNewSize=size)
幸存区比例:-XX:SurvivorRatio=ratio(比如ratio是8,意思是,伊甸园区是比例是8,to和from区各占一份)
动态幸存区比例:-XX:InitialSurvivorRatio=ratio and -XX:+UseAdaptiveSizePolicy(先设置一个初始幸存区比例,然后打开动态幸存区比例)
晋升阈值:-XX:MaxTenuringThreshold=threshold(幸存区寿命到达多少时,进去老年代)

垃圾回收器

垃圾回收器分为三类:
串行
吞吐量优先
响应时间优先

串行
单线程进行垃圾回收,适用于内存较小,cpu核数较少的个人电脑。
参数:-XX:+UseSerialGC = Serial + SerialOld
垃圾回收器在年轻代和老年代上是两个完全独立的垃圾回收器
Serial是在年轻代上的垃圾回收器,采用的是复制算法
SerialOld是在老年代的垃圾回收器,采用的是标记整理算法,效率较慢,但没有内存碎片。
SerialGC在进行垃圾回收的时候,会终止掉所有的用户线程,单线程操作,stw。

吞吐量优先
多线程进行垃圾回收,适用于内存较大,cpu核数较多,适用于服务器电脑。
jdk1.8默认使用的是这个。
参数:-XX:+UseParallelGC and -XX:+UseParallelOldGC
垃圾回收器在年轻代和老年代上是两个完全独立的垃圾回收器
-XX:+UseParallelGC是在年轻代上的垃圾回收器,采用的是复制算法
-XX:+UseParallelOldGC是在老年代的垃圾回收器,采用的是标记整理算法,效率较慢,但没有内存碎片。
单从算法上看,似乎和串行没有区别,最大的区别就是,gc在运行的时候,是多核cpu同时进行垃圾回收,大家一起上,快速解决战斗。
常见其他参数:
-XX:+UseAdaptiveSizePolicy :自动调整新生代内存
-XX:+GCTimeRatio = ratio :动态调整垃圾回收的时间与总时间的占比,公式:1/1+ratio,默认ratio是99,1/1+99=1%,也就是垃圾回收的时间不能超过1%,否则就会动态调整,一般就是增加堆的内存大小。
-XX:+MaxGCPauseMillis = ms, 最大暂停毫秒数,默认是200ms

响应时间优先
多线程进行垃圾回收,适用于内存较大,cpu核数较多,适用于服务器电脑。
参数:-XX:+UseParNewGC and -XX:+UseConcMarkSweepGC and SerialOld
最大特点是和用户线程并发执行,进行gc的某些阶段是不需要stw的。
-XX:+UseParNewGC是在年轻代上的垃圾回收器,采用的是复制算法
-XX:+UseConcMarkSweepGC是在老年代的垃圾回收器,采用的是标记清除算法,效率高,但是会产生内存碎片,碎片太多,老年代不能正常工作时,就会退化成SerialOld,采用标记整理算法,清除内存碎片。
-XX:+CMSInitiatingOccupancyFraction = percent , 因为最后一步的垃圾清理过程是并行执行的,因此,在进行gc的同时,有可能会产生浮动垃圾,也就是在gc的过程中,其他用户线程产生的垃圾,因此percent用来指定老年代垃圾到达一定的比例后,就会触发gc。