谈谈对JVM的理解(三)

谈谈对JVM的理解(三)

1、GC的算法和种类
  引用计数法:对于一个对象A,任何一个对象引用A,则A的引用计数器就加1,当引用失效时,引用计数器减一,当引用计数器为0时,就会被GC回收。
  缺点:引用和去引用伴随加法和加法,影响性能,而且很难处理循环引用
2、标记-清除
  是现代垃圾回收算法的思想基础。将垃圾回收分为标记阶段和回收阶段,标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象,然后在清除阶段,清除所有未被标记的对象。
3、标记-压缩
  适合用于存活对象较多的场合,如老年代。它咋标记-清除三方的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记,但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
4、复制算法
  与标记-清除算法相比,复制算法是一种相对高效的回收方法,适合于新生代对象比较多的情况。不适用于存活对象较多的场合,如老年代。将原有的内存空间分为两块,每次适用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。
  缺点:空间浪费,有一半的空间处于空闲,整合标记清理思想,这时就可以选择将小的存活对象做复制,大的对象和多次gc依然存活的小对象放入老年代,这样可以减少空间的浪费。
5、分代思想
  对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。根据不同代的特点,选取合适的收集算法:少量对象存活,适合复制算法,大量对象存活,适合标记清理或者标记压缩。
6、可触及性
  可触及的:从根节点可以触及到这个对象。
  可复活的:一旦所有引用被释放,就是可复活状态,因为在finalize()可能复活该对象。
  不可触及的:在finalize()后,可能会进入不可触及状态,不可触及的对象不可能复活,可以回收。
  根:栈中引用的对象,方法区中静态成员变量(全局对象),JNI方法栈中引用对象。
7、Stop-The-World
  Java中一种全局暂停的现象,全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互。多半由于GC引起(Dump线程,死锁检查,堆Dump)

猜你喜欢

转载自blog.csdn.net/qq_38019655/article/details/82779256