我知道他们已经用Java 8中的MetaSpace替换了PermGen。但是我有几个问题:

  • 默认情况下是否收集GC的MetaSpace?
  • 甚至PermGen是GC都通过添加argt之类的-XX:+CMSClassUnloadingEnabled来收集的,那么什么使MetaSpace比PermGen更好呢?
  • MetaSpace基于 native 内存,因此它将Java对象保留在磁盘上而不是VM上吗?
  • 即使MetaSpace也会用完内存?如果是这样,我将再次获得OutOfMemoryException
  • 默认情况下,MetaSpace可以随着内存的增加而增长吗?

  • 提前致谢

    最佳答案



    是的,GC满时将在元空间上运行,它也会
    动态增加(如果允许)分配给
    元数据。



    改进是随着元空间的动态扩展,
    是permgen无法做到的。



    根据对元空间的描述,它仅使用 native 内存
    (无分页)。

    根据Pierre-Hugues Charbonneau(link here)的研究,很明显,元空间的引入并不一定能解决OOM问题,它充其量只是解决问题的方法,它试图动态调整元空间的内存大小以适应不断增长的需求。加载的类的数量,这些类可能会产生不受控制地增长的副作用(只要 native 内存允许)。

    通过将MaxMetaspaceSize参数设置为JVM并运行提供的示例程序,可以实现著名的OOM错误。

    非常感谢Pierre-Hugues Charbonneau。

    07-24 15:18