JDK和JRE的区别
JDK:Java开发工具包,提供java开发环境和运行环境,包含JRE、编译器javac、java调试、分析工具
JRE:java运行环境,为java运行提供环境
运行java需要JRE,编写java需要JDK
垃圾回收算法
1.复制算法:可用内存分成相等的两块,每次使用一块,用完后,存活的对象复制到另一块内存,使用过的内存空间清理掉。不会产生内存碎片,年轻代算法
2.标记清除算法:对存活的对象先标记再回收。效率低+存在内存碎片
3.标记整理算法:标记过程类似标记清除算法,存活对象移动到一端,清除边界外的内存。如果对象被其他对象引用,移动对象需要调整引用地址、暂停应用,即STW。效率低+不会产生内存碎片
4.分代收集算法:新生代对象存活率低用复制算法。老年代对象存活率高用标记清除算法、标记整理算法
分代收集算法
1.年轻代回收算法
新生成的对象放在年轻代,年轻代存放生命周期短的对象,对象存活时间短
新生代内存按照 8:1:1 的比例分为 eden survivor0 survivor1 区,大部分对象在 Eden 区中生成
#回收过程
将 Eden 区存活对象复制到 survivor0 区,清空 eden 区
survivor0 区满了时,将 eden survivor0 区存活对象复制到 survivor1 区,清空 eden survivor0 区,再将 survivor0 区和 survivor1 区交换,保持 survivor1 区为空
survivor1 区不足以存放 Eden survivor0 区存活对象时,将存活对象存放到老年代。老年代满了触发 Full GC/Major GC,新生代、老年代回收
新生代触发 Minor GC,回收频率高(不一定等 Eden 区满了才触发)
2.年老代回收算法
年轻代中经历了15次垃圾回收后仍然存活的对象放到老年代,大对象直接进入老年代。老年代存放生命周期长的对象,对象存活时间长
老年代内存满了触发 Full GC,回收频率低
#总结
新生代和年老代的内存比例是 1:2
新生代一般采用复制算法,效率高,内存利用率低
老年代一般采用 标记清除/标记整理算法
垃圾回收器
#新生代
Serial(复制算法) 单线程,缺点是STW
ParNew(复制算法) 多线程
Parallel Scavenge(复制算法) 多线程,吞吐量优先;自适应调节吞吐量策略
#老年代
Serial Old(标记整理算法) 单线程,Serial老年代版本
Parallel Old(标记整理算法) 多线程,Parallel Scavenge老年代版本
CMS(标记清除算法) 多线程,停顿时间短、会产生内存碎片
G1(标记整理清除算法) 并行与并发、分代收集、空间整理、可预测停顿,不会产生内存碎片
CMS垃圾收集过程
初始标记:需要STW,标记GC Root能直接关联到的对象,速度快
并发标记:主要标记过程,和用户线程并发执行
重新标记前发生一次MinorGC,不会导致重新标记阶段STW时间太长,并发标记阶段包括一次并发的预清理阶段,虚拟机等待年轻代发生垃圾回收,这样可以将重新标记对象引用关系的步骤放在并发标记阶段,有效降低重新标记阶段STW的时间
重新标记:需要STW,修正并发标记期间因程序运作而导致标记产生变动部分对象的标记记录(停顿时间比初始标记长,比并发标记短)
并发清除:和用户线程并发执行的,基于标记结果来清理对象
优点:并发收集、低停顿
缺点:对cpu资源敏感、无法处理浮动垃圾、使用标记清除算法会导致收集结束时会有大量空间碎片产生
GC Root对象:虚拟机栈引用对象、本地方法栈引用对象、方法区类静态变量、常量引用对象
G1
G1收集器将java堆分成很多大小相同的分区region,新生代和老年代不再是物理隔阂,而是部分region的集合
处理过程:初始标记-并发标记-最终标记-筛选回收
G1垃圾收集器算法
双亲委派机制
类加载器收到类加载请求,不会先加载这个类,而是把请求委派给父类加载器,层层向上,父类无法加载请求时,再由子类加载器加载这个类
java引用
强引用:关联的对象永远不会被回收,是内存泄露的主要原因
软引用:关联的对象在内存不足时被回收
弱引用:关联的对象存活到下次垃圾回收发生前
虚引用:对象被回收时收到系统通知,不会影响对象的生存时间
引用强度从高到低:强引用、软引用、弱引用、虚引用
被标记为垃圾的对象一定会被回收吗
可达性分析算法中不可达的对象要经历两次标记过程
第1次标记:对象可达性分析后,发现没有与 GC Root 连接的引用链,会被第1次标记
第2次标记:筛选对象是否需要执行 finalize() 回收,finalize()中没有重新与引用链建立关联关系的,被第2次标记;否则继续存活。第2次标记成功的对象才会被回收
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。