热点JVM垃圾收集器

入侵

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

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

  2. 永久生成段是JVM Heap的一部分吗?Oracle OBE教程说是这样的:“堆部分是:年轻一代,老一代或终身一代以及永久代”(来源),但Mark Nelson分别谈到了永久代和堆(来源)。

  3. 从1.7 Java版本开始,字符串文字存储在Heap中,而不是存储在Permanent Generation中,这是真的吗?来源

  4. 原语存储在JVM中的何处?是堆还是永久生成?

  5. 常量存储在JVM中的何处?是堆还是永久生成?
埃德温·巴克(Edwin Buck)

Java中有多个垃圾收集器。但是最受欢迎的一种是“伊甸园”和老化模型。

当然,现在大多数人都在运行G1垃圾收集器,即使是流行的模型也常常无法描述实际发生的情况。不必太担心这种不准确性,在很多版本中,它实际上都是默认值。

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

  1. 从概念上讲,回收内存是首先完成的。如果JVM无法从非死线程到达对象,则将回收该对象(因为将来它无法成为执行程序的一部分...对象的句柄/地址的知识已永久丢失) 。
  2. 回收对象之后,它们将堆置于“瑞士奶酪”状态,其中某些区域正在使用,而其他区域则为空(由于回收)。压缩尝试消除堆中的“空洞”,使得分配大对象的尝试不会失败,因为请求的内存不能作为连续的地址序列使用。

在旧的伊甸园风格的垃圾收集器中,想法是

  1. 新创建的对象被回收的风险更高,因为它们可能是在块的范围内创建的(并且退出该块时,引用可能会丢失)。
  2. 较新创建的对象被回收的风险较低,因为它们可以在创建的块中幸免。

因此,“ eden”空间是堆的一部分,其中尚未检查对象以查看JVM程序执行线程是否仍可访问该对象。幸存者空间是对象被复制到的地方(复制允许重新分配地址,从而进行压缩),而其他更永久的空间则表明对象的寿命更长。

现在,借助新的G1垃圾收集器,您实际上可以拥有成千上万的微型堆,并且根据堆中包含的对象的生存能力来标记整个堆。压缩有时是通过组合两个“堆块”来完成的。但是,由于堆要小得多,因此通常只是丢弃而不是压缩堆(由于考虑到较少的对象时,堆中所有对象无法访问的可能性较高)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章