深入学习JVM笔记三 GC算法与种类

来源:互联网 发布:互联网金融产品知乎 编辑:程序博客网 时间:2024/05/15 16:31

GC 算法与种类

GC算法

引用计数法--没有被Java采用

引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被使用。


引用计数法的问题

引用和去引用伴随加法和减法,影响性能

很难处理循环引用


标记清除

标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。


标记压缩

标记-压缩算法适合用于存活对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。


复制算法

与标记-清除算法相比,复制算法是一种相对高效的回收方法

不适用于存活对象较多的场合如老年代

将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收



分代思想

依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。

根据不同代的特点,选取合适的收集算法

少量对象存活,适合复制算法

大量对象存活,适合标记清理或者标记压缩

可触及性

可触及的

从根节点可以触及到这个对象

可复活的

一旦所有引用被释放,就是可复活状态

因为在finalize()中可能复活该对象

不可触及的

在finalize()后,可能会进入不可触及状态

不可触及的对象不可能复活

可以回收

经验:避免使用finalize(),操作不慎可能导致错误。

优先级低,何时被调用,不确定

何时发生GC不确定

可以使用try-catch-finally来替代它

 

Stop-The-World

Java中一种全局暂停的现象

全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互

多半由于GC引起

Dump线程

死锁检查

堆Dump

GC时为什么会有全局停顿?

类比在聚会时打扫房间,聚会时很乱,又有新的垃圾产生,房间永远打扫不干净,只有让大家停止活动了,才能将房间打扫干净。

危害

长时间服务停止,没有响应

遇到HA系统,可能引起主备切换,严重危害生产环境(两个服务器同时启动,数据之间不同步)



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕期间想离婚怎么办 现在怀孕想离婚怎么办 孩子跟父母顶嘴怎么办 孩子嘴歪了怎么办 孩子跟老师顶嘴怎么办 孩子顶嘴父母怎么办读后感 孩子顶嘴总嬉皮笑脸怎么办 孩子和妈妈顶嘴怎么办 宝宝上火眼睛红怎么办 引产的孩子活着怎么办 八个月引产胎儿怎么办 小孩子有好动症怎么办 婴儿高烧38.5度怎么办 孩子发烧怎么办39度 宝宝发烧到37.7怎么办 几个月宝宝发烧怎么办 孩子八个月发烧怎么办 8个多月宝宝发烧怎么办 婴儿水便分离怎么办 宝贝发烧38.5度怎么办 调皮好动的孩子怎么办 小娃娃反复发烧怎么办 孩子在幼儿园好动怎么办 幼儿园好动的孩子怎么办 孕6月拉稀怎么办 孕3月拉稀怎么办 孕八个月拉肚子怎么办 怀孕七个月拉肚子怎么办 宝宝专注力差怎么办 8个宝宝拉肚子怎么办 孩子偏食不吃菜怎么办 孩子好动不认真学习怎么办 写作业写着写着就会发呆怎么办 孩子挑食偏瘦怎么办 小孩子好动和调皮怎么办? 打雷了怎么办教案反思 八个月小孩认生怎么办 八个月宝宝好动怎么办 小孩上课不听讲怎么办 小孩上课不注意听讲怎么办 小孩上课不爱听讲怎么办