HotSpot JVM垃圾收集器

时间:2014-09-03 07:41:24

标签: java garbage-collection jvm

我是Java的新手,我想知道不同版本的HotSpot JVM垃圾收集器的结构和垃圾收集过程的原理(我主要对Java 1.6中使用的那些感兴趣) ,1.7和1.8),但遗憾的是,我无法找到用Java来涵盖这一主题的广泛资源。

  1. 您能否向我推荐一些参考资料,我可以阅读更多有关不同版本的HotSpot JVM垃圾收集器的信息?

  2. 永久生成段是JVM堆的一部分吗? Oracle OBE教程说它是: "堆部分是:年轻一代,老一代或终身代,以及永久一代" (Source) 但马克·尼尔森分别谈到永久性生成和堆(Source)。

  3. 字符串文字存储在Heap中是否正确,但是从1.7 Java版本开始不存在于Permanent Generation中? (Source

  4. JVM中存储基元的位置是什么?它是堆还是永久生成?

  5. JVM中存储的常量是什么?它是堆还是永久生成?

2 个答案:

答案 0 :(得分:0)

链接有点旧,但我希望有所帮助

http://cs.williams.edu/~freund/cs434/hotspot-gc.pdf

也可能想检查

http://mechanical-sympathy.blogspot.com.br/2013/07/java-garbage-collection-distilled.html

最后一个在为所有类型的东西调整JVM时给了我很多帮助,无论如何都是一个很好的阅读。

答案 1 :(得分:0)

Java中有多个垃圾收集器;但是受欢迎的人才是“eden"和衰老模型。

当然,现在大多数人都在运行G1垃圾收集器,即使是那种流行的模型也经常没有描述真正发生的事情。不要太担心这种不准确性,对于很多版本来说,这是事实上的默认。

垃圾收集主要涉及两个主要任务,即回收内存和孔压缩。

  1. 首先在概念上完成回收记忆。如果JVM无法从非死线程到达对象,则回收该对象(因为它将来不能成为执行程序的一部分......对象的句柄/地址的知识已永久丢失)
  2. 一旦对象被回收,他们就会把这些堆放在瑞士奶酪"状态,使用某些区域,其他区域为空(由于回收)。压实尝试去除"孔"在堆中以这种方式尝试分配大对象不会失败,因为请求的内存不能作为连续的一系列地址。
  3. 对于旧伊甸园风格的垃圾收集者,其想法是

    1. 新创建的对象被回收的风险较高,因为它们可能是在块的范围内创建的(退出块时引用可能会丢失)。
    2. 新创建的对象回收的风险较低,因为它们在创建的块中幸存下来。
    3. 因此," eden" space是堆的一部分,其中尚未检查对象以查看JVM程序执行线程是否仍可访问它。幸存者空间是对象被复制到的地方(复制允许重新建立地址并因此压缩),而其他更永久的空间表示更长寿命的对象。

      现在有了新的G1垃圾收集器,你实际上有数千(到数百万)的迷你堆,整个堆都根据它包含的对象的生存能力进行标记。有时通过组合两个"堆积块来完成压缩&#34 ;;但是,由于堆大得多,通常它们只是被丢弃而不是压缩(由于当考虑更少的对象时堆中的所有对象都无法访问的可能性更高)。