JVM垃圾回收机制总结

153 阅读1分钟
  • 什么是垃圾?

    1、通过引用计数法判断,当应用为0的时候,即判断为垃圾。不过容易引起循环应用,判断不了是垃圾的情况。

    2、通过根搜索算法判断,通过可达性分析,也就是从GC Roots开始向下搜索,不可达的对象就是垃圾,避免了循环引用依赖的情况。

  • 有哪些可作为GC Root的对象

    1、虚拟机栈(栈帧中的本地变量表)中引用的对象 2、方法区中类静态属性引用的对象 3、方法区中常量引用的对象 4、本地方法栈中JNI(即一般说的Native方法)引用的对象

  • 运行时数据区包含以下两个部分

    1、由所有线程共享的数据区:方法区(Method Area)堆(Heap)--执行引擎

    2、线程隔离的数据区:虚拟机栈(VM Stack)本地方法区(Natvie Method Stack)程序计数器(Program Counter Register)-- 本地接口库

    3、本地方法库

  • 常规怎么回收垃圾

    1、 标记清除算法

    2、 标记复制算法

    3、 标记整理算法

现在常用的是 分代收集算法

堆空间 = 新生代(1/3)+ 老生代(2/3) 新生代 = Eden(8/10) + From(1/10) + To(1/10)

MinorGC:EDEN和From先用标记清楚法,然后Eden和From复制算法到To,Eden和To复制算法到From,经过16次也就是15岁的对象被移入老生代,解决内存碎片化。Major GC老生代采用标记整理算法。其中:

  • 大对象直接到老生代
  • From或者To区满的时候,先进去的去老生代