JVM4-垃圾回收

垃圾判定

引用计数算法

循环引用 每次都要技术影响性能

可达性分析算法

GCroot :jvm栈中引用的对象,方法区中的类静态属性引用的对象,常量池的对象,本地方法栈JNI(native方法)的引用的对象

回收算法

1)标记-清除算法 老年代
2)标记压缩 老年代
3)复制算法 缺点空间浪费
4)分代算法
新生代分为一大两小,大小8:1
大对象:移到老年代。
小对象:放置到复制空间
老年对象:长期有效的对象
s0、s1只有一个能用

内存空间

短命对象归为新生代,长命对象归为老年代
根据不同代的特点,选取合适的收集算法
少量对象存活,适合复制算法。新生代。
大量对象存活,适合标记清理或者标记压缩。老年代。
对象多次GC未被回收放入老年代,或者新生代空间不足放入老年代。

可触及性

  • 可复活: 一旦所有引用被释放,就是可复活状态;因为在finalize()中可能复活该对象;
    避免使用finalize()方法,被调用时间不确定,使用finally代替。
    finalize方法一个对象只能使用一次。
  • GCroot :jvm栈中引用的对象,方法区中的类静态属性引用的对象,常量池的对象,本地方法栈JNI(native方法)的引用的对象

Stop The World

所有Java代码停止,native代码可以执行,但不能和JVM交互
dump线程 死锁检查 dump堆 GC 可以一起StopTheWorld
GC线程之外的线程停止工作,进行垃圾回收。防止新的垃圾生成。
危害:长时间服务停止,没有响应;遇到HA系统,可能一起主备切换,严重危害生产环境。
老年代停顿时间长(微妙、秒、分钟都有可能)、新生代停顿时间短。