java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略

106 阅读2分钟

GC需要完成的三件事情:哪些内存需要回收、什么时候回收、如何回收

垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的方法有:

  1. 引用计数法: 给对象增加一个引用计数器,当有引用时加1;当引用时效时减1;计数器为0的对象就是不再被使用的。这种方法简单,判定效率也很高,但是不能解决对象之间循环引用的问题。
  2. 可达性分析法: 以GC Roots的对象当做起点,从这些节点向下搜索,搜索所走过的路径称之为引用链,当一个对象和GC、 Roots之间没有任何引用链相连时,则证明该对象是不可用的。

GC Roots的对象包含以下:

  1. 栈帧中的本地变量表中引用的对象;
  2. 方法区中类静态属性引用的对象;
  3. 方法区中常量引用的对象;
  4. Native方法引用的对象;

引用的定义:

  • 强引用、软引用、弱引用、虚引用。

回收方法区(hotSpot虚拟机中的永久代):

  • Java虚拟机规范说过可以不要求在方法区中实现垃圾收集,而且在方法区中收集的效率一般比较低。永久代中的垃圾回收主要两部分:废旧常量和无用的类。回收废弃常量的方法和回收堆中的对象很类似,如果没有其他地方引用这个字面量,这个常量就会被系统清理出常量池。常量池中其他类、接口、方法、字段的符号引用也类似。

同时满足一下条件才能被判定成一个无用的类:

  • 该类的所有实例都被回收,Java堆中不存在该类的任何实例; 加载该类的Class Loader已经被回收; 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

垃圾收集算法:

  • 标记-清除、复制、标记-整理

当前的商业虚拟机的垃圾收集都采用分代收集算法。一般是把Java堆分成新生代和老年代,根据各个年代的特点采用适当的收集算法。新生代一般采用复制算法,老年代使用标记-清楚、标记-整理。

内存分配与回收策略 Java技术体系中所倡导的自动内存管理最终可以概括为自动解决了两个问题:

  • 给对象分配内存以及回收分配给对象的内存。

内存的分配规则

  • 对象优先在Eden分配,当Eden没有足够的空间时,虚拟机将发起一次Minor GC。
  • 大对象直接进入老年代
  • 长期存活的对象进入老年代