Java对象的内存布局
Mark Word, Class Pointer, Instance data(如果是数组则为 Array Length和array data), Padding(用于对齐,使其为8的倍数)
java通过引用来访问对象,那怎么来确定哪些对象可以被回收呢
如何判断内存可以回收?
引用计数
可达性分析
标记一系列对象为GC Roots进行可达性分析,对应离散数学的图搜索
可以作为根节点的对象有虚拟机栈中引用的对象,方法区中静态属性引用的变量,方法区中常量引用的对象,本地方法栈中JNI引用的对象
什么时候进行回收?
怎么进行垃圾回收?
- 复制算法
新生代对象很大比例将直接被回收。
- 标记-清除算法
先标记,再清除
- 标记-整理算法
标记了将存活的对象进行移动,放到一堆
- 分代收集算法
- 新生代
- 老年代
- 永久代
1)废弃无用的常量
2)无用的类
所有的实例被回收,classloader回收,该类对应的class对象没有被引用
对象分配和垃圾回收
对象优先在新生代Eden分配,如果eden区域空间不足,则执行一次GC ---minorGC**
大对象直接进入老年代
-
长期存活对象进入老年代
每个对象都有一个年龄,保存在mark word中,minorGC一次还存活,则年龄加1
动态年龄的判断