我知道有人问过很多有关垃圾收集的问题,我已经遍历了这些问题,但是我仍然有一些疑问。

  • 如果我们不能强制JVM进行垃圾回收,那么System.gc()的需求是什么?在哪种情况下有用?
  • 我了解年轻一代[eden,SO,S1]和老一代以及如何将对象从年轻一代转移到老一代。什么时候将对象移至永久代?例如,我有具有引用且不符合垃圾回收条件的mycar对象,因此mycar对象何时会永久生成?
  • 我读过静态变量存储在永久代中。何时将它们收集为垃圾,并且永久生成中还存储什么类型的其他对象?为什么将静态变量存储在永久代中,永久代有什么用?
  • 我知道对象存储在堆内存中。每个应用程序都有自己的堆内存是否正确?
  • 的确,调用System.gc()会降低应用程序性能并减慢我们的应用程序的速度吗?还是每当JVM完成垃圾回收时,它都会降低应用程序性能,并使我们的应用程序运行缓慢?
  • 在哪些情况下会进行部分垃圾收集?何时进行主要垃圾收集?
  • 最佳答案

    1)System.gc()经常会工作。人们说不能强制垃圾回收的意思是,JVM比您了解更多有关内存状态的信息,如果JVM知道现在不是执行垃圾回收的好时机,那么您就不能强制垃圾回收。

    2)我不相信用户生成的类将使它成为perm gen(虽然我可能是错的),但它存在来存储元信息,例如JVM始终需要的类和内部字符串(Java 7之前的版本)等。

    3)静态变量是通过声明它们的class进行引用的。类存储在永久代中,因此就其本质而言,始终会引用静态变量,因此也将它们包含在perm gen中是有意义的。

    4)是的。

    从评论中编辑:
    垃圾回收永远不会永久进行。我对吗?

    不完全的。垃圾收集很复杂! perm gen的可变性远不及其余堆高,那里的对象很有可能会引用较低空间中的其他对象。我认为垃圾回收和perm gen的行为取决于您使用的Java版本,我相信较新的版本也会垃圾收集perm gen,这很有意义,因为Java大量使用了代理对象。

    关于java - 对Java中垃圾收集的怀疑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39159764/

    10-14 08:28