06-垃圾回收理论
2019-01-10 07:47:54来源:博客园 阅读 ()
一、关于回收目标
- 虚拟机栈/本地方法栈:顾名思义,该部分内存以栈的形式作为实现,那么在进栈、出栈的时候内存会自动释放,类似于C的“自动变量区域内存”;
- 堆:内存回收主要目标,可以认为类似于C中的“动态内存分配区域”,只不过C通过malloc与free函数手动进行管理,而java通过GC进行自动管理;
- 方法区:该区域回收效果很弱,虚拟机规范强制要求在这里进行回收。回收目标是常量池的回收和对类型的卸载;
二、方法区回收
2.1.常量回收
2.2.类卸载
- 该类所有实例已被回收;
- 该类的ClassLoader已被回收;
- 该类的类型信息,即java.lang.Class没有任何地方引用(一般为反射使用);
三、堆回收
3.1.对象存活判定
3.1.1.标记算法
- 栈上引用:虚拟机栈的栈帧中本地变量表内引用的对象;
- 栈上引用:本地方法栈中JNI引用的对象;
- 方法区:类静态属性引用的对象;
- 方法区:类常量引用的对象;
3.1.2.死亡判定
- 一次标记:即通过标记算法将对象标记为待回收状态,并进入一个待回收对象集合;
- 筛选:对一次标记之后的待回收对象进行过滤,如果该对象覆盖了finalize方法,并且该方法未执行过,则将该对象放入F-QUEUE;反之,对象没有覆盖finalize方法或者finalize方法已经被执行过了,该对象不会进行任何处理;
- F-QUEUE:一个队列,JVM会通过一个Finalizer线程去执行这个队列中对象的finalize方法,并且只保证该方法的执行,不保证该方法成功执行完成。因为若finalize方法有死循环,会造成FQUEUE后续未被执行对象的持续等待,导致整个内存回收系统崩溃。根据这个特点,对象可以在执行finalize方法时进行“自救”,所谓的自救,就是将对象重新与GC ROOTS相关联;
- 二次标记:GC会对FQUEUE中的对象进行额外的一次标记,若对象“自救”成功,则会从待回收对象集合中移除;若对象“自救”失败,它仍然会处于待回收对象集合中,等待真正被回收;
- 回收:对象通过垃圾收集进行回收,释放内存空间;
3.2.垃圾收集算法
3.2.1.标记-清除算法
3.2.2.复制算法
- eden:主存储区,新对象的创建都在这块区域;
- survivor:分为两块,一块作为上次回收结果的“缓存”,一块作为下一次回收的“缓存”区域;
3.2.3.标记-整理算法
3.2.4.总结
算法 | 优点 | 缺点 | 适用区域 |
复制 | 效率较高,无内存碎片问题 | 1.内存利用率达不到100%;2.需要分配担保机制确保对象存活率较高时的内存分配; | 新生代(对象存活率低,复制成本低) |
标记-清除 | 简单有效 | 1.效率不高;2.有内存碎片问题; | 老年代(对象存活率高,无额外空间进行分配担保) |
标记-整理 | 标记-清除的改良,解决了内存碎片问题 | 1.同样存在效率问题;2.整理过程需要额外的时间开销; |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 架构设计 | 缓存管理模式,监控和内存回收策略 2020-05-26
- 图解 Java 垃圾回收机制,写得非常好! 2020-05-22
- 3-JVM垃圾回收算法和垃圾收集器 2020-05-12
- 爱回收Java实习面试(offer到手含面试经验及答案) 2020-05-06
- 堆内存常见的分配策略、 经典的垃圾收集器、CMS与G1收集器及 2020-04-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash