ditunes / blog

write my idea & share my tunes
1 stars 1 forks source link

java虚拟机垃圾回收机制 #3

Open ditunes opened 8 years ago

ditunes commented 8 years ago

如何识别对象已死?

引用计算算法

* 虚拟机栈中的栈帧存储的本地变量表所指向的对象。(方法正在执行时候局部变量所指向的对象)
* 方法区中类静态属性引用的对象(静态变量指向的对象)
* 方法区中的常量引用对象(final)
* 本地方法栈中native method 引用的对象。
* 在Minor gc时候old代对象也将成为gc root,其指向的位于young代对象将不会被回收。

并不是所有被引用的对象都不可回收,还需要看引用的类型!

总之对象是否被回收,需要考虑从gc root出发能否通过引用搜寻到该对象,而且还需要考虑引用的类型,并针对引用类型决定是否回收对象。


内存回收机制

标记-整理法(Mark-Compact)

标记需要回收的对象,并使存活对象往内存一端移动,逐步填充生命周期结束的对象的空间。

标记-清除法(Mark-sweep)

标记生命周期结束的对象,并将其移除,很容易造成空间碎片化,使得内存利用率低,而且标记与清除效率不高

复制算法(Copying)

倘若将内存分为AB两块,A存放对象,当执行垃圾回收时,把存活对象拷贝到B,最后将A空间清除,使得空间回收效率高,没有碎片化出现。但是有一部分的内存空间会处于闲置状态,如前面的B空间,而且频繁复制会堆性能产生较大影响。分代收集法就是基于这个算法做了进一步扩展。

分代收集法(Generation Collection)

当前虚拟机根据对象生命周期长短不同的特点划分了不同意义的内存区域:

分代的含义

Young Generation(年轻代)

扩展资料 Metaspace in Java 8 Java永久代去哪儿了 Java 8: From PermGen to Metaspace