内存垃圾回收主要是解决3个问题
- 哪些内存需要回收 what
- 何时回收 when
- 怎么回收 how
哪些需要回收
程序计数器、方法栈、本地方法栈,这三个区域随着线程而生,随线程而灭
- 引用计数法 :
优点; 实现简单,效率高
缺点:无法判断环式引用 - 可达性分析:通过一系列称之为GC Roots的对象作为起始点,从这些节点开始向下搜索,所走过的路径称之为引用链。当一个对象到任何一个GC roots 不存在引用链相连的时候,则证明此对象是不可达的。java中GC Roots包含以下几种:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中引用的对象
何时回收
java中引用有如下几种
- 强引用
最普遍的存在 a=new A - 软引用
用来保存有用但非必须(例如cache)系统将要在发生内存溢出之前,将会把这些对象列进回收范围之内进行第二次回收 - 弱引用
也是用来描述非必须对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾回收之前,当垃圾回收的时候,无论内存是否足够,都会回收掉只被弱引用关联的对象(使用场合?) - 虚引用
虚引用的存在不会对生存周期产生任何影响,也无法通过弱引用取得一个对象的实例,为一个对象设置虚引用的唯一目的就是能在这个对象被回收之前收到一个系统通知
网友评论