垃圾回收

GC

引用计数算法

通关在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被引用则加1,删除引用则减1,当对象的引用计数为0时,那么该对象回收。
引用计数的问题,如果2个对象互相引用则永远不会回收。

可达性分析算法

通过GC roots的一些作为起点,向下搜索,当一个对象到GC roots没有任何链相连时,则证明该对象不可用。解决了引用计数无法解决的“循环依赖”问题。

可作为GC root对象

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

怎能回收垃圾

标记-清除算法 —>内存碎片问题
复制算法 解决碎片问题,平分代价太高
标记整理算法 内存变动频繁,效率低
分代收集算法 组合拳
Java堆分为新生代和老年代
新生代:对象存活量低,复制算法
老年代:对象存活量高,另外两种算法

Java堆

新生代 分为Eden区 和 Survivor区(分为From和To区):减少被送到老年代的对象,减少major GC的次数
minor GC回收,Eden清空,无法回收的对象到From区,Survivor的两个分区,每次minor GC,复制对象,一个区域为空,减少内存碎片
老年代 占对内存2/3 在major GC才会清理,每次GC都是STW 采用标记-整理算法
大对象 长期存活对象
动态对象年龄

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。