Java基础--垃圾回收GC

原文链接: http://www.cnblogs.com/luangeng/p/6033994.html

GC:

垃圾回收由JVM中GC线程监控和执行。

参考: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

GC算法:

1. 标记清除法

首先从根节点开始遍历所有对象,标记出被引用的对象,然后遍历堆,释放所有未标记的对象,会产生内存碎片。

2.复制法

将内存划分为大小相等的两块,开始只使用其中的一块,当这块耗尽之后,将存活的对象复制到另外一块,重新分配地址,然后全部清理这块。

3.标记整理算法

在标记清除的基础上移动存活对象,并更新引用指针,避免产生内存碎片。

分代回收

虚拟机对内存进行分代管理
MinorGC是对Young Generation内存区的GC,速度较快且频繁。
MajorGC是对Old Generation内存区的GC,速度较慢,会使应用程序挂起,也称FullGC。
大多数对象生命期很短,在Eden区域中创建和销毁。当Eden内存区域耗尽时,GC线程进行一次MinorGC。
MinorGC时将Eden区域的对象移动到一块Survivor区域和Old区。
某些需要大量连续空间的对象会直接在老年代中分配,XX:PretenureSizeThreshold参数可控制这些大对象的阈值。
jvm为每个对象内存定义age,age每经过一次新生代GC便加1。
当对象的age达到一个阈值时,该对象会被移动到Old区,该阈值可由-XX:MaxTenuringThreshold设置,默认15。
 
 
GC种类:
根据不同内存区域,有不同的垃圾回收器。Young区有:Serial Collector,ParNew Collector,Parallel Scanvenge Collector。Old区有:Serial Old Collector,Parallel Old ollector,CMS Collector。

1.serial collector  单线程收集器

使用单线程去完成所有的gc工作
Client模式下默认
可用-XX:+UseSerialGC强制使用

2.parallel collector  并行收集器

使用多线程的方式,利用多CUP来提高GC的效率
主要以到达一定的吞吐量为目标
Server模式下默认
--YGC:PS FGC:Parallel MSC
可用-XX:+UseParallelGC或-XX:+UseParallelOldGC强制指定
--ParallelGC代表FGC为Parallel MSC
--ParallelOldGC代表FGC为Parallel Compacting
优点:高效
缺点:当heap变大后,造成的暂停时间会变得比较长

3.concurrent collector

并发收集器
使用多线程的方式,利用多CUP来提高GC的效率
并发完成大部分工作,full gc pause短
可用-XX:+UseConcMarkSweepGC强制指定
缺点:
1.会产生内存碎片
2.回收的整个耗时比较长
3.和应用争抢CPU

 

转载于:https://www.cnblogs.com/luangeng/p/6033994.html

猜你喜欢

转载自blog.csdn.net/weixin_30565327/article/details/94786622