在收集年轻一代内存时,JVM收集器只扫描那些属于年轻一代的根对象(堆中的OBEJCT可从根集中直接访问),还使用写屏障支持的卡表/记忆集来确定旧一代的区域,这些区域可能包含对年轻一代中对象的引用的对象。
我的问题是,如果年轻的收集器确定年轻一代中的某个特定对象只有来自老一代中某个对象的一个外部引用,它如何知道老一代对象本身是否是垃圾,从而使年轻一代对象“活动”且不符合收集条件?例如,在老一代中,可能有一条从根集直接到该对象的路径,而该路径又引用了所述年轻一代对象。年轻的收集器通常会认为这个年轻一代对象是活动的,还是在决定忽略/收集它之前,如何确定指向它的老一代对象是否是活动的/垃圾的?
问题是“如何达到这种情况?”
要创建从旧对象到年轻对象的引用,旧对象必须是可访问的,否则我们无法在其中存储对年轻对象的引用。为了之后变得不可访问,我们必须至少修改根引用或之前引用有问题的旧对象的另一个旧对象。
正如您已经提到的,JVM会跟踪这些写入,这一点至关重要,因为为了检测旧对象现在引用了一个年轻对象,它必须知道旧对象(又名卡)的内存区域已被修改。原则上,由于卡标记也意味着记住传入的引用,gc现在能够检测到旧对象变得无法访问,即使没有主gc。它只需要考虑修改的卡(或根集)就可以了解它。是否确实如此,取决于环境因素,如选择的gc算法,即您是否使用CMS(won't)或G1(may),以及如何配置"混合集合"或实际内存压力。
当然,如果您使用并发收集器,则有可能在收集周期已经在进行时发生使旧对象无法访问的修改。在这种情况下,在这个gc周期中,可能会认为年轻对象是可访问的,即使修改发生在一纳秒之前。
它如何知道旧一代对象本身不是垃圾?
它不知道这是一个主要/完整系列的目的。我们的假设是,旧的gen对象不会经常死亡。
执行完整收集时,它会检查所有对象,但执行次要/年轻收集时,只清理年轻收集中的对象。
如果我错了,请随时指正。在JVM堆中,有老一代和年轻一代两代。在做全GC时,在老一代中,有像紧凑空间和修复漏洞这样的繁重操作,这会使JVM挂起。而我发现在年轻一代中,应用了一个轻量级的GC,从我的搜索结果中还有一个叫做Eden的区域涉及年轻一代。但是,在搜索了很多文档后,我对年轻一代中的GC仍然有两个困惑, 在年轻一代中,GC似乎不像老一代GC那样工作(即老一代GC压缩并修复漏洞)?如果是这样,年
我在尝试理解垃圾收集机制,我在研究代际算法,我有一个关于年轻人和老年人的代沟的问题。我读到,在年轻一代开始收集物品,GC是从GC根开始标记它们,以找到活的,通常它会将它们复制到幸存者空间,清除年轻一代区域,然后瞧。 我不明白,如果我们从GC根开始,我们开始遍历活动对象,我们不是也在旧一代中找到了对象吗?这是否意味着,当我们击中旧空间中的一个物体时,我们会在那个点上停止跟踪参照物?
问题内容: 当伊甸园空间年轻时已满,将触发次要GC。在次要GC过程中,伊甸园和一个源Survivor空间中的非自由对象将被复制到另一个目标Survivor空间。 我的问题是,如果目标“幸存者”空间已满,次要GC如何处理? 问题答案: 如果不可能执行/完成次要收集,则将执行主要/完整收集。通常使用标记扫描紧凑算法而不是复制算法来完成此操作……这是完整收集昂贵的原因之一。 但是最终(如果您继续填充堆)
当伊甸园空间充满年轻一代时,小GC将被触发。在次要GC过程中,伊甸园和一个源幸存者空间中的非自由对象将被复制到另一个目标幸存者空间。 我的问题是,如果目标幸存者空间已满,minor GC如何处理?
每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1
我正在做一个与JVM GC相关的项目,我计划用我的手动GC取代JVM自动GC。 我知道JAVA有一个自动垃圾收集器。如果我们集成一个新的手动垃圾收集器,其中开发人员需要显式地调用new并删除对象(如在C中)。 让我们假设程序员在没有内存泄漏的情况下写入空闲。 使用手动垃圾回收机制代替自动垃圾回收机制是否有效? 在工业中使用手动GC是否常见?还是程序员到处使用自动垃圾回收器?