0

换句话说:

我需要知道在调用System.gc()对象实例(未收集的)之后是否以与调用之前相同的方式在代之间分布System.gc()

谢谢,

4

2 回答 2

5

在 System.gc() 可能触发也可能不触发的 Full GC 之后,

  • 伊甸园空间将是空的,因此其中的任何东西都将被移出或清理。
  • 幸存者空间会将对象从有对象的空间交换到空的空间,并且
  • Tenured 空间将具有与之前相同的保留对象,但有些可能已被清理,有些可能是该代的新对象。

简而言之,唯一一次 System.gc() 不会在几代之间改变对象是什么时候

  • 它什么也没做,因为它被忽略了
  • 自上次 Full GC 以来没有对象被创建或丢弃。

如果这可能是调用 System.gc() 是邪恶的另一个原因

主要是因为它会损害性能并且您获得的回报很少。注意:RMI 可以定期触发完整收集以确保清理分布式对象,但它会尝试将其保持在最低限度。

于 2012-10-16T07:45:32.470 回答
1

首先,这System.gc()只是对 JVM 的一个提示,你想要一个 GC,它可能不会触发一个(例如,如果-XX:+DisableExplicitGC与 Hotspot 一起使用),你不应该依赖它来做任何事情——无论如何,JVM 通常知道得更好。

如果它确实触发了 GC,那么它就像任何其他 GC 一样,并且如果对象满足条件(例如,在幸存者空间中花费了足够多的代),则对象可能会从年轻代提升到老年代。

于 2012-10-16T07:46:32.207 回答