-
什么是垃圾?
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区满的时候,先进去的去老生代