怀疑Java中的垃圾收集

Fai*_*med 5 java garbage-collection memory-management

我知道很多关于垃圾收集的问题,我已经完成了它们,但我仍然有一些疑问.

  1. 如果我们不能强制JVM进行垃圾收集那么需要System.gc()什么?它在哪种情况下有用?

  2. 我知道年轻一代[eden,SO,S1]和老一代以及物体如何从年轻一代转移到老一代.何时将对象移动到永久生成?例如,我有mycar一个引用的对象,并且不符合垃圾收集的条件,所以什么时候mycar对象会在永久生成中移动?

  3. 我已经读过静态变量存储在永久生成中.什么时候它们会被垃圾收集以及永久生成哪种类型的其他物品?为什么静态变量存储在永久生成中以及永久生成的用途是什么?

  4. 我知道对象存储在堆内存中.这是真的,每个应用程序都有自己的堆内存吗?

  5. Calling是否会System.gc()降低应用程序性能并降低我们的应用程序速度?或者,当JVM完成垃圾收集时,它会降低应用程序性能并使我们的应用程序工作缓慢?

  6. 在哪些情况下,部分垃圾收集完成,何时进行主要垃圾收集?

Stu*_*ion 3

1)System.gc()经常工作。当人们说你不能强制垃圾收集时,他们的意思是 JVM 比你更了解内存的状态,如果 JVM 知道现在不是执行垃圾收集的好时机,你就不能强制垃圾收集。

2)我不相信用户生成的类会进入perm gen(尽管我可能是错的),它的存在是为了存储JVM始终需要的元信息,例如类和interned字符串(Java 7之前)等。

3)静态变量是由class它们声明的引用。类存储在永久代中,因此本质上静态变量将始终被引用,因此将它们放在永久代中也是有意义的。

4)是的。

从评论中编辑:垃圾收集永远不会在永久代上完成。我对吗?

不完全的。垃圾收集很复杂!永久代的波动性远低于堆的其余部分,并且那里的对象很可能会引用较低空间中的其他对象。我认为垃圾收集和永久代的行为取决于您使用的Java版本,我相信较新的版本也会对永久代进行垃圾收集,这是有道理的,因为Java大量使用代理对象。