有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java关于垃圾收集内部的一些问题?

我试图了解垃圾收集过程是如何工作的。遇到了好消息。 大多数文章说,在次要GC收集期间,对象从伊甸园移动到幸存者空间,在主要GC收集期间 对象从幸存者移动到终身空间,否则所有无法访问的对象内存都会被回收。我有三个问题(需要问 根据上述陈述,以单步执行(因为它们是相关的):-

1)Minor vs Major GC collection ? What is the difference between two that one is called major and other is called minor collection? 据我所知,小收集过程与应用程序运行并行,而大收集过程使应用程序运行 在此期间暂停

2)What actually happens when object is moved from eden to survivor space ? Does the memory location of object is changed internally?

我知道这背后一定有原因,但我错过了。 我的观点是,当GC运行时,收集不可到达的对象,并将可到达的对象仅保留在该空间中。只有一个空间似乎就足够了。那么三种不同的优势是什么呢 空间被证明超过一个


共 (2) 个答案

  1. # 1 楼答案

    1)小GC发生在新一代,大GC发生在老一代。它是否与应用程序并行取决于GC的类型,只有CMS和G1可以同时工作

    2)是的,GC期间移动对象会更改其物理位置,因此指向该对象的所有指针都将被更新

    3)这是为了避免GC期间经常和长时间的应用冻结。如果它是一个大堆,那么应用程序通常会长时间冻结。JVM在年轻的一代中创建对象,其中的GCs频繁但快速出现。JVM创建的大多数对象都会很快消亡,它们永远不会进入旧一代,所以大型GC很少发生,或者根本不会发生

  2. # 2 楼答案

    我的答案来源是this Oracle article on GC basics,所以这些答案适用于热点。对于其他虚拟机没有任何线索,尽管我猜,如果在其他虚拟机中使用相同的实现技术,总体思路可能会保持不变

    Minor vs Major GC collection? What is the difference between two that one is called major and other is called minor collection?

    次要GC是年轻一代的GC,在这里分配新对象。Major GC是所有活动对象的GC,包括永久生成(这对我来说有点有趣,但这就是本文所说的)。此外,似乎主要和次要GC都是世界事件的停止

    What actually happens when object is moved from eden to survivor space? Does the memory location of object is changed internally?

    我现在似乎找不到推荐人,但我想是的。允许更改内存位置可以执行压缩,从而提高内存分配性能和易用性。允许每个空间单独压缩是有意义的,所以我猜将对象从堆的一部分移动到另一部分将涉及将对象从一个内存位置物理移动到另一个内存位置

    Why not just one space exist instead of three (i.e eden, survivor and tenured space) exist?

    简单回答:效率。如果只有一个空间,则在GC时必须检查所有对象,如果有很多长寿命对象(而且在一个长期运行的应用程序中几乎可以保证有相当数量的长寿命对象),这将变得效率低下,因为这些长寿命对象可能仍然可以从一个GC访问到下一个GC。拆分堆可以优化GC,因为大多数GC工作可以集中在对象寿命较短(即年轻一代)的地方,而寿命较长的对象进行GC的频率较低