为什么在垃圾收集中使长寿命的对象有所作为?
问题内容:
我经常读到,在Sun JVM中,短寿命对象(“相对较新的对象”)比长寿命对象(“相对较旧的对象”)可以更有效地进行垃圾回收。
- 为什么呢?
- 这是特定于Sun JVM还是由一般的垃圾回收原理导致?
问题答案:
大多数Java应用程序都会创建Java对象,然后很快将其丢弃。您可以在方法中创建一些对象,然后一旦退出该方法,所有对象都会死亡。大多数应用程序都是以这种方式运行的,并且大多数人倾向于以这种方式编写其应用程序的代码。Java堆大致分为三部分,永久的,老的(长寿)一代和年轻的(短寿)一代。Young
gen进一步细分为S1,S2和Eden。这些只是堆。
大多数对象都是在年轻一代中创建的。这里的想法是,由于对象的死亡率很高,因此我们快速创建它们,使用它们然后丢弃它们。速度至关重要。创建对象时,年轻的gen会填满,直到出现次要的GC。在次要GC中,将所有活动对象从eden复制并说S2到S1。然后,将“指针”放在eden和S2上。
每个副本都会老化该对象。默认情况下,如果对象存活32个副本,即。32个次要GC,然后GC认为它将存在更长时间。因此,它要做的就是通过将其移交给旧一代来保有它。老一代只是一个大空间。当旧一代填满时,旧一代会发生一个完整的GC或主要GC。由于没有其他空间可复制到,因此GC必须紧凑。这比次要GC慢很多,这就是为什么我们避免更频繁地这样做。
您可以使用
java -XX:MaxTenuringThreshold=16
如果您知道自己有很多寿命长的物体。您可以使用以下命令打印应用程序的各个年龄段
java -XX:-PrintTenuringDistribution