深入java虚拟机之垃圾回收

深入java虚拟机之垃圾回收
. 哪些区域需要回收
. 什么时候回收
. 如何回收

回收判定

堆中对象

可达性算法

使用可达性分析方法,从gc root向下搜索,如果一个对象到gc roots没有任何引用链。证明该对象不可用
可以作为gc roots 有四种

引用类型

我们时常有这种需求,有些对象我们想他一直存在即使内存溢出,有些对象在内存溢出之前对这些对象就行回收。如果此时内存还不够,就报内存溢出异常。

gc回收到底是以可达性算法来算还是以引用类型来算。

gc过程

其实用可达性算法进行判定之后,就属于秋后问斩类型了。这时候进行第一次标记,对那些重写了fin方法的对象进行标记。这些被标记的将进入一个队列。队列中的将会交给一个fin线程来处理。
该线程执行final 方法如果此时对象在fin方法中指向了强引用,就逃出生天。反之就只能乖乖等死了

方法区回收

回收算法

复制:为什么不是8:1的两个区域。而是8:1:1的三个区域。
原因:

复制的实践基础是:8:1 大部分对象都朝生夕死。
但是在我们不断的gc过程中,有些生命力十分顽强,这些基本不太被回收,这就脱离了我们的复制方法的实践基础了。
此时,应该把他们单独放在一个区域(老年代),单独管理(标记——清除法)

回收方式的选择

jvm有client和server两种模式,两种模式下选择的回收模式是不一样的。
此坑待填

发生在新生代的回收一般称为minor gc,发生在老年代的回收一般称为major回收。一般一次老年代的回收伴随着一次新生代的
回收。但是这也不是绝对的
full gc
full gc是对新生代、老年代以及持久代的统一回收,由于是对整个空间的回收,因此比较慢,应该尽量减少full gc的次数

触发full gc的情况

  1. 老年代空间不足 (这个显而易见)
  2. 永久带空间不足
  3. 统计得到新生代minor gc时晋升到救生带的平均大小小于旧生代剩余空间
  4. 直接调用System.gc,可以DisableExplicitGC来禁止
    其他还有xxx等等

问题记录

jit编译到底是什么