笔记JVM —— 垃圾收集器和内存分配策略

引用计数算法

主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。例如两个对象相互持有对方对象的一个字段的引用。

可达性分析法

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots 没有任何引用链相连时,则证明此对象是不可用的。

 

java中,可作为GC Roots 的对象包括下面几种

  • 虚拟机栈中的引用对象
  • 方法区中的类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

四大引用

强引用 一般是直接通过new 出来的对象,只要存在就不会被回收

软引用 在发生内存溢出之前,会对其进行二次回收

弱引用 无论当前内存是否足够,都会回收掉

虚引用 

 

垃圾收集算法

标记-清除算法 :效率低,碎片化

复制算法

标记-整理算法:后续不是直接对回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

分代收集算法

 

 

 

内存分配和回收策略

对象优先在Eden分配

对象的内存分配,主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。

大对象直接进入老年代

大对象指需要连续内存空间的java对象

长期存活的对象将进入老年代

如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页