JDK8为什么要使用元空间取代永久代?

永久代是 HotSpot VM 对方法区的实现,JDK 8 将其移除的部分原因如下:

  • 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出
  • 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低
  • 将 HotSpot 与 JRockit 进行整合,JRockit 是没有永久代的