文章插图
- 分代收集算法(Generational Collection)
文章插图
新生代(Young Generation)的回收算法(以复制算法为主)
- 所有新生成的对象首先都是放在年轻代的 。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象 。
- 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区 。一个Eden区,两个 Survivor区(一般而言) 。大部分对象在Eden区中生成 。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空,如此往复 。
- 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代 。若是老年代也满了就会触发一次Full GC(Major GC),也就是新生代、老年代都进行回收 。
- 新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发) 。
- 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中 。因此,可以认为老年代中存放的都是一些生命周期较长的对象 。
- 内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高 。
用于存放静态文件,如Java类、方法等 。永久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的永久代空间来存放这些运行过程中新增的类 。永久代也称方法区 。方法区主要回收的内容有:废弃常量和无用的类 。对于废弃常量也可通过根搜索算法来判断,但是对于无用的类则需要同时满足下面3个条件:
- 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
- 加载该类的ClassLoader已经被回收;
- 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法 。
- Serial收集器(复制算法)
- Serial Old收集器(标记-整理算法)
- ParNew收集器(停止-复制算法)
- Parallel Scavenge收集器(停止-复制算法)
- Parallel Old收集器(停止-复制算法)
- CMS(Concurrent Mark Sweep)收集器(标记-清除算法)
- 初始标记: 标记GC Roots能直接关联到的对象,速度很快;
- 并发标记: 进行GC Roots Tracing的过程;
- 重新标记: 修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但比并发标记时间短;
推荐阅读
- 浅谈假期户外野餐必知事项
- 成长为月薪50K的Java技术专家,必须掌握的7大技能
- JavaScript类型判断
- Node.js 12.7.0 发布,服务器端的 JavaScript 运行环境
- 关于 Java 序列化你不知道的 5 件事
- Java NIO 2.0相关知识点
- 茶知识 茶叶种类 饮茶文化 饮茶健康 泡茶工具 喝茶必知
- 学习JAVA的十二大步骤,值得你借鉴
- Java开发者必备的9个网站
- 新手必会的PS去水印方法,绝对简单!