java 中的gc的几种方式及各个方式使用的收集算法

 

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其它的工作线程,然后开始标记edenservivor(form)的活动对象,标记结束后,edenservivor(form)区的所有活动对象转到servivor(to),这时一些大对象会被直接复制到old,然后edenservivor(form)区里剩余的对象均是垃圾了,释放他们占用的内存。这时将servivor to区标记为form,form标志为to区。

如果在复制到to区时,to区已满,则直接复制到old区。

l Mark-sweep-compact算法:

     在mark,标记活动的对象,sweep,标记垃圾对象,compact,将活动对象向old区的一端平移,然后将垃圾对象释放,这时old区的另一端就是一大块可用的空间。

l 并行gc:

   并行gc就是使用多线程(linux中叫多进程)执行串行的gc算法;

l 并发gcCMS)算法:

      (1)并发gc会先暂停jvm运行,然后标志应用中的强可达对象

      (2)开始并发标志引用强可达对象的对象;这时程序还在运行,

      (3)因为程序正在运行,这时重新标志一下引用被修改的对象(这时jvm会再次暂停)

      (4)重新标记后,堆中所有活动对象被标记出来了,然后开发开始回收堆中的垃圾对象;

        (5)该算法不进行compact,而是在内存中建立一个空闲内存的链表,下次在old区分配空间时,会先找到一个符合条件的空闲空间给对象,该方式会影响old区和young区的对象空间分配,影响young区主要是由于有些young区的对象需要转至old区.

你可能感兴趣的:(java 中的gc的几种方式及各个方式使用的收集算法)