我对Heap,Young,Tenured和Perm一代感到困惑。
谁能解释一下?
Java垃圾收集器被称为分 代垃圾收集器
。应用程序中的对象生存的时间长短不一,具体取决于它们的创建位置和使用方式。此处的主要见解在于,针对短期和长期对象使用不同的垃圾回收策略,可以针对每种情况专门优化GC。
松散地说,当对象在新 世代中 “生存”重复的垃圾回收时,它们将迁移到 终身代 。该 永久代
是一个特例,它包含对象,是由JVM需要的,这不一定是在你的程序来表示,代表的类和方法的示例对象。
由于“ 年轻一代” 通常会包含很多垃圾,因此已对其进行了优化,可以一次清除很多未使用的对象。由于 Tenured Generation
包含寿命更长的对象,因此已针对快速垃圾回收进行了优化,而不会浪费大量内存。
随着垃圾收集技术的改进,细节变得非常复杂,并且取决于您的JVM及其配置方式。如果您需要确切了解正在发生的事情,则应该阅读所使用的特定JVM
的文档。
就是说,有一个简单的历史安排,在概念上仍然有用。从历史上看, 年轻一代 将是一个
抄袭者 , 终身一代 将是一个
记号和打扫者 。一个 副本收集
基本支付摆脱垃圾没有CPU成本,大部分的成本是保持活动对象,这种效率的价格是较重的内存使用情况。一个 标记和清除收集
支付一些CPU成本现场和未使用的对象,但更有效地利用内存。
问题内容: 是否将“静态最终”直接分配给年轻一代或老一代或烫发一代?(我猜想在我认为的时间内,它很可能会降落到旧的gen中。)如果在perm gen中分配了它,那么当在Perm Gen中进行类卸载时,是否会收集垃圾? 问题答案: 是否将“静态最终”直接分配给年轻一代或老一代或烫发一代? 变量引用的对象将根据与其他任何对象相同的规则进行分配。它最有可能在年轻一代或老一代中分配(如果它很大,并且适用某
我预先承认,这个问题非常类似于:大量cms标记/备注暂停,即使旧版还没有满一半,并且无明显原因开始使用终身收藏。我发帖是因为1。这些线已经有1年多的历史了,还有2年。我希望学习如何找到这种行为的根本原因。 我们有一个OAS/OC4J(这不是我们的错!)运行在RHEL5/Redhat 5.11、Java 6上的全天候Java应用服务器。这在内存方面已经稳定了很多年,直到最近,由于频繁的CMS终身空间
我们使用G1收集器<当一个年轻的GC发生时(不是混合GC),堆的变化:[Eden:3666.0M(3666.0M)- 堆的变化为4819.1M(5346.0-526.9) 伊甸园改变了3666.0(3666.0-0.0)和幸存者-34M(20-54);为什么堆的变化不等于伊甸园和幸存者的总和(4819.1不等于(3666.0-34))?年轻的GC清除对象在老一代? gc日志:
我正在为max分配8GB内存给Java编写的应用程序。它会内存溢出。我相信年轻一代总是比默认情况下的老一代小(堆的1/4)。而Eden/幸存者1,2在年轻一代内部。我相信在Eden空间中创建了新对象。 即使老一代还没有满,但年轻一代已经完全满了,java应用程序还是会耗尽内存吗? 如果短寿命的对象比长寿命的对象多,那么可以为年轻一代分配更多内存,或者至少将堆的50%分配给年轻一代吗?或者,由于jv
我在尝试理解垃圾收集机制,我在研究代际算法,我有一个关于年轻人和老年人的代沟的问题。我读到,在年轻一代开始收集物品,GC是从GC根开始标记它们,以找到活的,通常它会将它们复制到幸存者空间,清除年轻一代区域,然后瞧。 我不明白,如果我们从GC根开始,我们开始遍历活动对象,我们不是也在旧一代中找到了对象吗?这是否意味着,当我们击中旧空间中的一个物体时,我们会在那个点上停止跟踪参照物?
如果我错了,请随时指正。在JVM堆中,有老一代和年轻一代两代。在做全GC时,在老一代中,有像紧凑空间和修复漏洞这样的繁重操作,这会使JVM挂起。而我发现在年轻一代中,应用了一个轻量级的GC,从我的搜索结果中还有一个叫做Eden的区域涉及年轻一代。但是,在搜索了很多文档后,我对年轻一代中的GC仍然有两个困惑, 在年轻一代中,GC似乎不像老一代GC那样工作(即老一代GC压缩并修复漏洞)?如果是这样,年