Gc module |
New generation |
Old generation |
-XX:+UseSerialGC |
串行gc |
Mark-sweep-compact |
-XX:+UseParallelGC |
并行gc |
Parallel mark sweep GC |
-XX:+UseconcMarkSweepGC |
并行gc |
并发(注意是并发)gc |
-XX:+UseParNewGC |
并行gc |
串行gc |
-XX:+UseParallelOldGC |
并行gc |
Parallel mark sweep |
-XX:+UseConcMarkSweep -XX:-UseParNewGC |
串行gc |
并发gc,当发生concurrent mode failure 时改为串行gc |
不支持的模式 |
-XX:+UseParNewGC -XX:+UseParallelGC -XX:+UseParNewGC-XX:+UseSerialGC |
|
l 串行gc的算法:
执行gc时,会暂停jvm其它的工作线程,然后开始标记eden和servivor(form区)的活动对象,标记结束后,将eden和servivor(form)区的所有活动对象转到servivor(to)区,这时一些大对象会被直接复制到old区,然后eden和servivor(form)区里剩余的对象均是垃圾了,释放他们占用的内存。这时将servivor 的to区标记为form,form标志为to区。
如果在复制到to区时,to区已满,则直接复制到old区。
l Mark-sweep-compact算法:
在mark时,标记活动的对象,sweep时,标记垃圾对象,compact时,将活动对象向old区的一端平移,然后将垃圾对象释放,这时old区的另一端就是一大块可用的空间。
l 并行gc:
并行gc就是使用多线程(linux中叫多进程)执行串行的gc算法;
l 并发gc(CMS)算法:
(1)并发gc会先暂停jvm运行,然后标志应用中的强可达对象;
(2)开始并发标志引用强可达对象的对象;这时程序还在运行,
(3)因为程序正在运行,这时重新标志一下引用被修改的对象(这时jvm会再次暂停)
(4)重新标记后,堆中所有活动对象被标记出来了,然后开发开始回收堆中的垃圾对象;
(5)该算法不进行compact,而是在内存中建立一个空闲内存的链表,下次在old区分配空间时,会先找到一个符合条件的空闲空间给对象,该方式会影响old区和young区的对象空间分配,影响young区主要是由于有些young区的对象需要转至old区.