垃圾收集器与内存分配策略
-XX:+PrintGCDetails
一、概述
垃圾收集器关注的内存:方法区、java堆(因为这部分内存的分配和回收都是动态的)
二、对象已死吗(判断对象是否存活)
计数算法:
给对象中添加一个引用计数器,每当有一个地方引用它时,加一,引用失效时,减一
主流的java虚拟机不采用这种方法,原因:
难以解决对象之间的循环引用问题
可达性分析算法
通过一系列成为“GC ROOTS”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,
当一个对象到GC ROOTS没有任何引用链相连时,则证明此对象是不可用的
可作为GC ROOTS的对象:
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
关于引用
强———————————————–》弱
强引用—》软引用—》弱引用—》虚引用
强引用:只要强引用存在,GC永远不会回收掉被引用的对象
软引用:(SoftReference)描述还有用但并非必须的对象,在系统将要发生内存溢出异常之前,会把这些对象列进回收范围中
进行第二次回收,如果还是没有足够的内存,才报OOM
弱引用