当前位置: 首页 > 知识库问答 >
问题:

JVM何时会触发主要的垃圾收集?

莘睿
2023-03-14

我试图了解垃圾收集是如何工作的。我很清楚以下几点:

  1. 当JVM无法将对象分配给年轻一代时,它将触发小型GC
  2. 列表项

当堆满时,JVM将触发完整的GC(两个次要的主要GC)。

但是,年轻一代和老一代中不再引用、符合GC条件但没有触发GC的对象如何(即年轻/老一代堆空间未满,因此没有GC发生)

这是否意味着在GC发生之前,这些对象将保留在年轻/老一代堆空间中?

我的阅读材料

>

http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/

https://www.infoq.com/articles/Java_Garbage_Collection_Distilled

共有2个答案

燕超
2023-03-14

是的,如果没有GC,那么对象将存在于堆中。

实际上,即使是在GC对象在年轻一代时,它也会存在于堆中,直到它被覆盖为止,如果是旧的,它取决于算法——但这仅从安全角度来看是有趣的。

晋坚
2023-03-14

它仍然保留在旧一代中,并且在出现完整/主要GC之前,总体堆使用率会增加。ops团队正在监控堆的使用情况,他们担心堆的增长。

如果您的目标是监控活动对象的数量,例如检测泄漏,那么您应该在主要GC之后立即测量堆占用率,而不是在它们之间。

例如,可以从GC日志文件中提取信息。

当堆满时,JVM将触发完整的GC(两个次要的主要GC)。

情况未必如此。何时触发一个集合的决定是基于启发式的,它考虑了各种目标,比如暂停时间和吞吐量。

 类似资料:
  • 主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、

  • 主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、

  • 问题内容: 我一直在阅读有关Java和SO Q&A的垃圾收集的信息,但是我对垃圾收集的类型感到困惑。 让我们以吞吐量收集器为例。(又名并行收集器)。文档说它使用多个线程来进行 次要 集合,而使用单个线程来进行 主要 集合(与串行收集器相同)。 现在我的问题是: 完整GC的含义是什么:a)是否意味着次要收藏和主要收藏都已完成?或b)完整GC ==主要收藏?哪一个? 如果是a),是否意味着次要集合仍使

  • 问题内容: 我有一段代码可以在内存中加载很大的图像。所以打电话似乎是合理的事情 在加载图像之前。据我所知,它毫无问题。 昨天,我决定使用一个名为FindBugs的非常有用的软件来扫描您的代码并报告可能导致错误或通常不建议使用的策略的问题。问题是我提到的这段代码得到了报告。描述是这样的: …强迫垃圾收集;除了基准测试代码外,都非常可疑 并继续阐述: 代码显式调用垃圾回收。除了基准测试中的特定用途外,

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1

  • 为了理解可用的JVM垃圾收集算法,我在查看java-available垃圾收集算法链接时感到困惑。 根据我的理解,将会有一些标准的GC算法,不同的JVM供应商实现这些算法来创建垃圾收集器。 现在请帮助我理解下面是算法还是算法的实现: 序列, 平行, CMS, G1, 我认为这些是实现某些特定算法的垃圾收集器类型(我不知道算法的名称)。 此外,我还浏览了在http://www.oracle.com/