调用System.gc()会重置世代集合的统计数据吗?

时间:2012-10-16 07:40:34

标签: java garbage-collection

换句话说:

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

谢谢,

2 个答案:

答案 0 :(得分:5)

在完整GC之后,System.gc()可能触发或不触发,

  • 伊甸园空间将是空的,因此那里的任何东西都会被搬出或清理干净。
  • 幸存者空间将对象从具有对象的对象交换到空对象,
  • Tenured空间将拥有与之前相同的保留对象,但有些可能已经清理过,有些可能是新一代的新事物。

简而言之,System.gc()唯一不会在代之间更改对象的时间是

  • 它没有做任何事情,因为它被忽略了
  • 自上次完整GC以来,没有创建或丢弃任何对象。
  

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

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

答案 1 :(得分:1)

首先,System.gc()只是你想要GC的JVM的提示,它可能不会触发一个(例如,如果使用带有Hotspot的-XX:+DisableExplicitGC),你不应该依赖它做了什么 - 无论如何,JVM通常都知道得更好。

如果它确实触发了GC,那么它就像任何其他GC一样,如果它们符合标准(例如在幸存者空间中花费了足够的代数),对象可能会从年轻人升级到老一代。

相关问题