Java GC

1、如何判断对象不可用

判断对象不可用有2个算法:引用计数法可达性分析算法

引用计数法:给对象添加一个引用计数器当计数为0是说明对象不在被引用。

        优点:操作简单、方便实现。

        缺点:无法解决对象相互引用的问题

可达性分析算法:当对象到GC ROOTS没有连接,证明对象不可用。但是当对象的finalize()方法被重写重新与GC ROOTS连接那么对象会变成可达对象;若没重写方法就会被回收。一个对象finalize()方法只会被调用一次。

2、GC ROOTS有哪些

  • 在虚拟机栈中的引用对象
  • 在方法区中类静态属性引用的对象
  • 在方法区中常量引用的对象
  • 在本地方法栈中JNI引用的对象
  • Java虚拟机内部的引用
  • 所有被同步锁持有的对象 

3、 GC 算法

GC有3种算法:标记清除算法复制算法标记整理算法

标记清除算法:将在使用的对象标记,清除未被标记的对象。  

复制算法:幸存者区的复制(from - to);每次GC将伊甸园的存活对象放到幸存者中,幸存者有2个区域谁空谁是被复制的区域。

标记整理算法:先执行标记清除算法,然后在整理,将内存碎片移动到一端。

算法优点缺点
标记清除效率快内存碎片
复制算法没有内存的碎片占用空间
标记整理内存整齐效率低

4、GC 回收器

Serial GC/Serialold GC:串行回收(单线程)和STW机制,SerialGC采用复制算法,用于新生代的垃圾回收;SerialoldGC采用标记-整理算法,用于老年代的垃圾回收;

ParNewGC:并行回收(多线程)和STW机制,只适用于新生代的垃圾回收,采用复制算法;

ParallelScavenge GC/Parallelold GC(吞吐量优先):并行回收和STW机制,ParallelScavenge采用复制算法,用于新生代的垃圾回收;Parallelold采用标记-整理算法,用于老年代垃圾回收;Parallel与ParNew的区别在于自适应调节策略;

CMS(ConcurrentMarkSweep)(低延迟):并发回收,GC线程与用户线程同时进行,采用标记-清除算法,用于老年代的垃圾回收;

CMS四个阶段:

1.初始标记阶段:STW机制,主要任务只是标记出与GCroots直接关联的对象,这个过程耗时很短;

2.并发标记阶段:从与GCroots直接关联的对象开始向下搜索,标记出所有的关联对象,这个过程耗时很长,但不妨碍用户线程的继续执行;

3.重新标记阶段:STW机制,主要目的是为了修正并发标记期间,因用户程序的继续运作而导致标记对象产生变动的部分;

4.并发清除阶段:清除标记阶段识别的不可达对象,释放内存空间;

回收器分类作用位置使用算法特点
serial串行运行新生代复制算法响应速度快
ParNew并行运行新生代复制算法响应速度快
Parallel并行运行新生代复制算法
serial Old串行于行老年代标记整理响应速度快
Parallel Old并行运行老年代标记整理
CMS并发运行老年代标记清除响应速度快
G1并行、并发运行不分代(分区)标记整理、复制响应速度快

jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1

内存溢出:实实在在的内存空间不足导致;
内存泄漏:该释放的对象没有释放,多见于自己使用容器保存元素的情况下。

性能优化 各种参数配置调调整整:堆空间大小、内存大小等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值