Java中的垃圾回收

元空间

由于元数据空间大小的预测是件繁琐且低效的工作,于是Java 8中干脆就去掉了持久代,转而推出了元空间。从此以后,那些个杂七杂八的东西便都存储到正常的Java堆了。

但是,类定义如今则是存储到了元空间里。它存储在本地内存中,不会与堆 内存相混杂。默认情况下,元空间的大小只受限于Java进程的可用本地内存的大小。这大大解放了开发人员,他们不会再因为多增加了一个类而引发 java.lang.OutOfMemoryError: Permgen space 异常了。值得注意的是,虽然看似元空间大小毫无限制了,但这一些并非是没有代价的——如果任由元空间无节制地增长,你可能会面临的是频繁的内存交换(swapping)或者是本地内存分配失败。

如果你希望避免此类情况,可以像下例中这样限制一下元空间的大小,将它设置成比如256MB:

java -XX:MaxMetaspaceSize=256m com.mycompany.MyApplication

新生代GC(Minor GC) vs 老生代GC(Major GC) vs Full GC

清除堆内存不同区域的垃圾回收事件又被称为新生代GC,老生代GC,以及Full GC事件。本章我们将介绍一下不同事件的区别在哪里。不过你会发现其实各自的差别并不是那么重要。

重要的是我们希望知道应用是否到达它的服务能力上限了,而这又只能去监控应用的处理延时或者吞吐量。只有在这个时间GC事件才能派上用场。这些事件的关键之处在于它们是否停止了应用的运行,以及停了多久。

不过由于新生代GC,老生代GC,Full GC这几个术语被广泛使用却又没有一个清晰的定义,我们还是先来详细地介绍一下它们的区别再说吧。

新生代GC

新生代垃圾的回收被称作