冀教网 - 河北教师网站 - 专注于冀教版课本资源

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 82|回复: 0

JVM_浅析“堆与GC算法”

[复制链接]

4万

主题

4万

帖子

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122192
发表于 2020-5-23 21:13 | 显示全部楼层 |阅读模式
一、堆的组成部分

1-1、三大组成部分:


  • 新生代:新生代会频繁触发 MinorGC 进行垃圾回收

    • 伊甸园区(Eden):每次 new  出来的对象存放的位置。
    • 幸存者0区(ServivorFrom):每次gc垃圾回收的幸存者存放的位置。
    • 幸存者1区(ServivorTo):每次gc垃圾回收时,下一批幸存者存放的位置
    注意:默认内存比值为 8:1:1,且每次 ServivorFromServivorTo,会交换位置的!

  • 老年代:当新生代的对象,被 gc 十五次之后,都还幸存,就存放到这里。(如果new 的对象很大,也会直接放到这)
  • 永久代(方法区):存放着 jre 中自带的一些类的信息,静态变量,常量等数据,不过7之后,常量池都放到堆中去了!(这也就说明了,为什么它叫永久代,因为这些东西,我们不需要管,所以8之后,把它用元空间取代了,因为它都不和我们 new 出来的对象在一块,所以干脆把元空间归于 本地内存!)
二、GC算法

2-1、什么时候进行垃圾回收?


  • 新生代区域中的 Eden区满了时,触发 MinorGC (复制算法)
  • 老年代区域中也满了,触发 MajorGC (标记清除算法)
2-2、什么时候进行垃圾回收?

如何确定是否为垃圾?


  • 引用计数法:如果一个对象实例,没有引用地址指向它,那么他的引用计数就是0,则判定为垃圾。
  • 可达性分析:为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots” 对象作为起点搜索。如果在“GC roots”和个对象之间没有可达路径,则称该对象是不可达的。
    要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记 过程。两次标记后仍然是可回收对象,则将面临回收。
2-3、复制算法 (MinorGC)

过程:复制 => 清空 => 交换

  • 复制:首先把 EdenServivorFrom 的幸存者,复制到 ServivorTo 区域,并且让幸存者年龄 +1,
                   ,同时判断幸存者年龄,如果年龄达到了 15 ,就转移到老年区!
  • 清空:接着清空 EdenServivorFrom
  • 交换:交换 ServivorFromServivorTo  ,以实现循环清理,直到年龄达到 老年区。
优点:耗时较短,且不会有内存碎片。
缺点:需要额外的一块空白的区域,进行幸存者转移。
总结:空间换时间。适合存活率低的区域(新生代),存活率低,需要复制的幸存者就少,性能消耗的就少。
2-4、标记清除算法(MajorGC )

过程:扫描一次,进行标记,再扫描一次,进行清除。
标记:GCRoot算法,判断是否为垃圾,可清除。
优点:不需要额外的空间,进行幸存者转存。
缺点:耗时较长,而且会留下一块块的内存碎片!
总结:时间换空间。适合存活率高的区域,(老年代),幸存者较多,复制的话,太浪费性能了。
2-5、标记  整理/压缩  清除算法

过程:在前者的基础上,又多了一次扫描,然后将 幸存者 和 内存碎片 给整理到各自的整块的领域。
优点:不需要额外的空间,切没有内存碎片残余。
缺点:耗时长!
总结:和前者相同,不过不宜频繁使用!
2-6、体会

由于  MajorGC  的内存碎片的缘故,如果可以通过判断 MajorGC 进行多少次后,内存碎片会比较多,然后进行一次内存碎片整理,应该算是一种优化!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|冀教网 - 河北教师网站 - 专注于冀教版课本资源  

GMT+8, 2020-5-30 02:40 , Processed in 0.250158 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表