【问题标题】:Doubts on Garbage Collection in javajava中垃圾回收的疑惑
【发布时间】:2017-01-02 17:46:44
【问题描述】:

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

  1. 如果我们不能强制 JVM 进行垃圾收集,那么 System.gc() 需要什么?在什么场景下有用?

  2. 我了解年轻一代 [eden,SO,S1] 和老一代,以及对象如何从年轻一代移动到老一代。什么时候将一个对象移到永久代?例如,我有 mycar 对象,该对象具有引用且不符合垃圾回收条件,那么 mycar 对象何时会移入永久代?

  3. 我读到静态变量存储在永久代中。它们什么时候会被垃圾回收,以及哪些类型的其他对象存储在永久代中?静态变量为什么存放在永久代,永久代有什么用?

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

  5. 调用System.gc() 是否真的会降低应用程序性能并减慢我们的应用程序?或者当 JVM 完成垃圾收集时,它会降低应用程序的性能并让我们的应用程序运行缓慢?

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

【问题讨论】:

  • 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


【解决方案1】:

1) 经常重复的陈述是真实的,但具有误导性。方法规范(即 javadocs)的措辞使 noop 实现有效。换句话说,没有规范保证它做任何事情或只做异步事情或其他什么。

但实现可以提供更强大的行为。换句话说,人们应该说的是System.gc 依赖于实现和配置,并且在某些情况下确实在每次调用时始终触发 GC。

2) Perm gen 是 java 8 之前的热点 JVM 的实现细节。

3) 他们不是

4) “应用程序”太模糊了,你可以在一个共享的 JVM 上运行多个应用程序。每个 JVM 有一个托管堆。

5) 这是两个独立的问题。

6) 取决于 JVM 实现和选择的 GC 算法。我建议你阅读文档。

【讨论】:

    【解决方案2】:

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

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

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

    4) 是的。

    从 cmets 编辑: 垃圾收集永远不会在永久代上完成。我说的对吗?

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

    【讨论】:

    • 永久代中存储的其他东西是什么?
    • 字符串是否存储在永久代中?
    • 内部字符串,虽然显然不再。这曾经是这种情况,但在 Java 7 中发生了变化,我会更新我的答案!
    • 垃圾收集永远不会在永久代上完成。我对吗?因为它包含元数据
    • 这听起来像是使用System.gc(); 的好场景,但我认为真正的用例很少见。
    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多