首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HotSpot垃圾收集器

HotSpot垃圾收集器
EN

Stack Overflow用户
提问于 2014-09-03 07:41:24
回答 2查看 184关注 0票数 0

我对Java相当陌生,我想了解不同版本的Java垃圾收集器的结构和垃圾收集过程的原则(我对Java1.6、1.7和1.8中使用的垃圾收集过程的原则很感兴趣),但不幸的是,我找不到一个广泛的源代码来讨论这个主题。

  1. 您能给我推荐一些参考资料吗?在这里,我可以更多地阅读HotSpot垃圾收集器的不同版本。
  2. 永久生成段是JVM堆的一部分吗?Oracle教程说:“堆部件是:年轻一代、老一代或终身世代和永久世代”(来源),但Mark分别谈到了永久世代和堆(来源)。
  3. 字符串文本存储在堆中,而不是存储在从1.7JAVA版本开始的永久生成中,这是真的吗?(来源)
  4. JVM中的原语存储在哪里?它是堆还是永久的世代?
  5. JVM中的常量存储在哪里?它是堆还是永久的世代?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-03 08:07:44

Java中有多个垃圾收集器,但最流行的是"eden“和老化模型。

当然,现在大多数人都在运行G1垃圾收集器,即使是流行的模型也常常没有描述实际发生的事情。不要太担心不准确,对于相当多的发布来说,这是事实上的违约。

垃圾回收是两项主要任务,即回收内存和压缩孔。

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

有了伊甸园风格的垃圾收集器,他们的想法是

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

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

现在,使用新的G1垃圾收集器,您实际上拥有了数以千计(到数百万)的迷你堆,整个堆是根据它包含的对象的生存性来标记的。压缩有时是通过组合两个“堆块”来完成的;然而,由于堆非常小,它们常常被丢弃而不是压缩(因为当需要考虑的对象较少时,堆中的所有对象都很难到达)。

票数 0
EN

Stack Overflow用户

发布于 2014-09-03 07:54:44

这个链接有点旧,但我希望它能有所帮助。

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

也可能要检查一下

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

上一篇文章帮助我很好地调整JVM中的各种内容,不管怎么说,这是一个很好的阅读。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25638855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档