JVM学习之路(二)
GC
垃圾回收机制是由垃圾回收器Garbage Collection GC来完成的,GC是后台的守护线程,优先级比较低,可以根据内存的使用情况动态的调整其优先级。
垃圾回收机制调用之前,还会有有一些清理工作。垃圾回收只能回收通过new关键字申请的内存(堆内存),但是堆上的内存并不完全是通过new分配的。还会有一些本地方法的调用,这部分特殊的内存,如果不通过手动释放,就会导致内存泄漏。GC是无法回收这部分内存的,所以需要在finalize中用本地方法(native method)如free操作等,再使用gc方法。显示的GC方法System.gc()。
自适应的、分代的、停止-复制、标记-清扫式垃圾回收器
1.新生代Young generation
a.Eden space任何新进入运行时数据区域的实例都会存放于此
b.S0 Survivor space存在时间较长,经过垃圾回收没有被清除的实例,就从Eden 搬到了S0
c.S1 To Space 同理,存在时间更长的实例,就从S0 搬到了S1
2.旧生代Old generation/tenured
同理,存在时间更长的实例,对象多次回收没被清除,就从S1 搬到了tenured
3.永生代Perm
存放运行时数据区的方法区
不同的世代采用不同的回收机制
新生代的对象回收采用Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少。将原本 Survivor 内经过多次垃圾收集仍然存活的对象移动到 Tenured。
旧生代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法。它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
永久代(Permanet Generation),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类。