GC

Java对象的内存布局

Mark Word, Class Pointer, Instance data(如果是数组则为 Array Length和array data), Padding(用于对齐,使其为8的倍数)

java通过引用来访问对象,那怎么来确定哪些对象可以被回收呢

如何判断内存可以回收?

  1. 引用计数

  2. 可达性分析

标记一系列对象为GC Roots进行可达性分析,对应离散数学的图搜索

可以作为根节点的对象有虚拟机栈中引用的对象,方法区中静态属性引用的变量,方法区中常量引用的对象,本地方法栈中JNI引用的对象

什么时候进行回收?

怎么进行垃圾回收?

  1. 复制算法

新生代对象很大比例将直接被回收。

image
  1. 标记-清除算法

先标记,再清除

  1. 标记-整理算法

标记了将存活的对象进行移动,放到一堆

  1. 分代收集算法
  • 新生代
  • 老年代
  • 永久代
    1)废弃无用的常量
    2)无用的类
    所有的实例被回收,classloader回收,该类对应的class对象没有被引用

对象分配和垃圾回收

  • 对象优先在新生代Eden分配,如果eden区域空间不足,则执行一次GC ---minorGC**

  • 大对象直接进入老年代

  • 长期存活对象进入老年代

    每个对象都有一个年龄,保存在mark word中,minorGC一次还存活,则年龄加1

    动态年龄的判断

你可能感兴趣的:(GC)