Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于垃圾收集内部的一些问题?_Java_Garbage Collection - Fatal编程技术网

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

Java 关于垃圾收集内部的一些问题?,java,garbage-collection,Java,Garbage Collection,我试图了解垃圾收集过程是如何工作的。结果很好。 大多数文章说,在次要GC收集期间,对象从伊甸园移动到幸存者空间,在主要GC收集期间 对象从幸存者移动到终身空间,否则所有无法访问的对象内存都会被回收。我有三个问题(需要问 根据上述陈述,以单步执行(因为它们是相关的):- 1) 次要GC收集与主要GC收集?一个称为主要收藏,另一个称为次要收藏,两者之间的区别是什么? 据我所知,小收集过程与应用程序运行并行,而大收集过程使应用程序运行 在此期间暂停 2) 当物体从伊甸园移动到幸存者空间时会发生什么?对

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

1)
次要GC收集与主要GC收集?一个称为主要收藏,另一个称为次要收藏,两者之间的区别是什么?
据我所知,小收集过程与应用程序运行并行,而大收集过程使应用程序运行 在此期间暂停

2)
当物体从伊甸园移动到幸存者空间时会发生什么?对象的内存位置是否在内部更改?

3)
为什么不仅仅存在一个空间而不是三个空间,即伊甸园、幸存者和终身空间?
我知道这背后一定有原因,但我错过了它。 我的观点是,当GC运行时,收集不可到达的对象,并将可到达的对象仅保留在该空间中。只有一个空间似乎就足够了。那么三种不同的优势是什么呢 空格超过一个?

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

次要GC收集与主要GC收集?一个称为大集合,另一个称为小集合,两者之间的区别是什么

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

当物体从伊甸园移动到幸存者空间时会发生什么?对象的内存位置是否在内部更改

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

为什么不存在一个空间而不是三个空间(即伊甸园、幸存者和终身空间)

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

我的答案来源是,因此这些答案适用于热点。没有关于其他虚拟机的线索,尽管我猜想,如果在其他虚拟机中使用相同的实现技术,那么总体思路可能会保持不变

次要GC收集与主要GC收集?一个称为大集合,另一个称为小集合,两者之间的区别是什么

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

当物体从伊甸园移动到幸存者空间时会发生什么?对象的内存位置是否在内部更改

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

为什么不存在一个空间而不是三个空间(即伊甸园、幸存者和终身空间)

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

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

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

3) 这是为了避免GC期间经常和长时间的应用程序冻结。若它是一个大堆,那个么应用程序通常会长时间冻结。JVM在年轻的一代中创建对象,其中的GCs频繁但快速出现。JVM创建的大多数对象死得很快,它们永远不会到达老一代,因此主GC很少发生,或者根本不会发生。

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

2) 是的,移动的物体