Java GC笔记

1.在新生代中,常规的应用进行一次垃圾收集(采用的是标记-复制算法),一般可以回收70~90%的空间,而永生代的垃圾收集效率远低于此;

2.永久代的垃圾回收主要回收两个部分;
1)废弃常量:与回收java堆中的对象非常相似,eg:一个字符串“abc”已经进入常量池中,但是当前没有任何String对象引用常量池中的"abc"常量,就会被诶清理。;
2)无用的类:常量池中的其他类,方法,字段的符号引用也类似

3.判断一个类是否为无用的类需要同时满足三个条件:
1)该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
2)加载该类的ClassLoader已经被回收;
3)该类对应的class对象没有任何地方被引用,无法再任何地方通过反射的方法访问该类的方法;

4.垃圾收集算法:
1)标记-清除,即首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记对象(对象不可到达的对象),该算法两个缺点:a.效率低;b.产生大量不连续的内存碎片。
2)复制算法,内存分成两块(实际情况不需要按1:1划分,默认是8:1:1),只使用其中一块,当这块用完后,将存活的复制到另外一块上,已使用的内存块进行一次性清理,该算法缺点:a)    对象存活率较高时,需要进行较多的复制操作,效率降低;b)更关键的是需要额外的空间进行分配担保。
3)标记-整理,与标记-清除算法类似,但标记后续不是直接对可回收对象进行清理,而是将所有存活的对象向一端移动,然后直接清理掉边界以外的内存。
4)分代收集算法,将Java堆分为新生代和老年代,然后根据各个代的特点采用最合适的收集算法。在新生代,每次垃圾回收都会有大批对象死去,只有少量的存活,即采用复制算法;在老年    代,对象存活率过高,没有额外空间进行担保,即采用标记-整理算法进行回收。


5.HotSpot算法实现:
1)枚举根节点,GC Roots,通过OopMap协助下,快速且准确的完成GC Root枚举;
2)安全点,没有为每条指令都生成OopMap,只是在Safepoint点记录这些信息,程序只会在这些点停顿下来进行GC。
   两种方式确保执行GC时,线程都跑到最近的Safepoint再停顿下来:
   a.抢断式中断:发生GC时,停止所有线程,没有在Safepoint的就跑到Safepoint上;
   b.主动式中断:线程主动轮询这个标志,该标志与Safepoint是重合的,如果为真,就自己中断挂起;
3)基于安全点,仍有不足之处,就是如果线程处于sleep或者blocked状态,无法响应JVM的中断请求,即无法在Safepoint处中断挂起,这是就需要Safe Region来解决,安全区域可以看成扩展的安全点,当代码执行到safe region时,就标识自己已经进去safe region,在发生GC时,无需再进行标识了。

6.CMS收集器:
基于“标记-清除”算法实现,运行分为4个步骤:
1)初始标记(stop the world),仅仅只是标记一下GC Roots直接能关联到的对象,速度很快;
2)并发标记,就是进行GC Roots Tracing过程,耗时最长,且会占用部分cpu(默认启动回收线程数 (cpu数+3)/4),当cpu数不足的时候导致用户程序执行速度下降严重;
3)重新标记(stop the world),为了修正并发标记因用户程序继续运作而导致标记变动一步部门,耗时比初始标记略长;
4)并发清除;
缺点:
1)cpu敏感,在并发阶段,虽然不会导致用户停顿,但是会因为占用了一部分cpu资源,导致应用程序变慢;
2)无法处理浮动垃圾,导致出现“Concurrent Mode Failure”失败而导致一次Full GC的产生;
3)产生空间碎片;
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值