GC的算法和种类

Garbage Collection 垃圾收集,java中GC的对象是堆空间和永久区。

引用计数法:

当有其他对象引用当前对象的时候加1,引用消失的时候减1。为o的时候就GC。对象循环引用的时候比较难回收。

标记清除法:

分两个阶段,一个是标记阶段,一个是回收阶段。

从跟节点不可到达的对象标记为需要垃圾回收。

标记-压缩法:

移动存活对象,清理存活意外的对象。GC时分两个阶段,首先是把可触及的对象标记为存活对象,然后第二个阶段是移动存活对象到内存的一端,然后清除其他非存活对象。相比复制算法,标记压缩算法不需要两个内存空间。

复制算法:

不适合存活对象比较多的场合,将内存空间分为两块,发现有需要GC的对象时,将一块的存活空间复制到另一块。然后在角色互换。相对于标记压缩算法,需要两个内存空间,但较快,用空间换时间。

扫描二维码关注公众号,回复: 249168 查看本文章

分代思想

短命的归为新生代,长命的归为老年代(在新生代时经过多次GC后没有能够回收,就进入老年代)。

少量对象存活,适合复制算法。大量对象存活,适合标记清理和标记压缩算法。

可触及性

可触及的:从根节点的引用链条可触及的对象。不可触及的:在finalize()后,能会进入不能触及状态,不可触及对象不可能复活。finalize()只会被调用一次。在finally中来释放资源比较可靠。不推荐使用System.gc();不可控。

栈中引用的对象

方法区中静态成员或者常量引用的对象(全局对象)

JNI方法栈中引用对象

Stop-The_World(类比在聚会时打扫房间,聚会时很乱,又有新的垃圾产生,房间永远大少不干净,只有让大家停止活动了,才能将房间打扫干净)

Java中一种全局暂停的现象

全局暂停,所有java代码停止,Native代码可以执行,但不能喝JVM交互。

多半是由于GC引起的:Dump线程,死锁检查,堆Dump。

危害:长时间服务停止,没有响应。遇到HA系统,可能引起准备切换,严重危害生产环境。

猜你喜欢

转载自peng4602.iteye.com/blog/2366779