【发布时间】:2017-01-02 17:46:44
【问题描述】:
我知道有人问过很多关于垃圾收集的问题,我已经解决了这些问题,但我仍然有一些疑问。
如果我们不能强制 JVM 进行垃圾收集,那么
System.gc()需要什么?在什么场景下有用?我了解年轻一代 [eden,SO,S1] 和老一代,以及对象如何从年轻一代移动到老一代。什么时候将一个对象移到永久代?例如,我有
mycar对象,该对象具有引用且不符合垃圾回收条件,那么mycar对象何时会移入永久代?我读到静态变量存储在永久代中。它们什么时候会被垃圾回收,以及哪些类型的其他对象存储在永久代中?静态变量为什么存放在永久代,永久代有什么用?
我知道对象存储在堆内存中。每个应用程序都有自己的堆内存是真的吗?
调用
System.gc()是否真的会降低应用程序性能并减慢我们的应用程序?或者当 JVM 完成垃圾收集时,它会降低应用程序的性能并让我们的应用程序运行缓慢?在哪些情况下会完成部分垃圾收集,何时执行主要垃圾收集?
【问题讨论】:
-
4) 是的。每个应用程序都有自己的堆内存。您可以通过在同一系统中运行两个 diff java 应用程序并为其提供最大和平均堆大小来检查这一点。
-
5) 这取决于发生了哪种类型的 GC .. 如果是 Full GC,那么 stop the world 将会发生,这可能会在 Full gc 时间内停止您的应用程序。在部分 GC 的情况下不会发生这种情况。
-
so 在这种情况下执行部分和主要 gc
-
在我看来,这些应该是单独的问题。
-
从库中调用
System.gc()总是可行的,因为库编写者对应用程序一无所知。从应用程序调用它几乎总是错误的,因为 GC 比大多数程序员更了解它的工作。有cases when it helps。
标签: java memory-management garbage-collection