我知道他们已经用Java 8中的MetaSpace取代了PermGen。但是我几乎没有问题:
-XX:+CMSClassUnloadingEnabled
这样的args来收集GC,那么是什么让MetaSpace比PermGen更好?OutOfMemoryException
。 提前致谢
答案 0 :(得分:50)
默认情况下,MetaSpace是否收集GC?
是的,当GC变满时,GC将在元空间上运行,它也会 动态增加(给定允许)分配的内存 元数据。
即使PermGen是通过添加像-XX:+ CMSClassUnloadingEnabled这样的args来收集GC,那么是什么让MetaSpace比PermGen更好?
改进是随着元空间的动态扩展而来的 是permgen无法做到的事情。
MetaSpace基于本机内存,因此它将java对象保留在磁盘而不是VM上?
根据元空间的描述,它只使用本机内存 (没有分页)。
根据Pierre-Hugues Charbonneau(link here)的研究,很明显,元空间的引入并不一定能解决OOM问题,它是一个叛变者。问题充其量,它试图动态调整元空间内存的大小,以适应越来越多的类,这些类可能会无法控制地增加可能的副作用(只要本机内存允许它)。
我们可以通过将MaxMetaspaceSize
参数设置为JVM并运行提供的示例程序来实现着名的OOM错误。
答案 1 :(得分:10)
回应:
默认情况下,如果Metaspace内存到达MaxMetaspaceSize,则会收集它。此参数最初是无限的。限制是机器中的内存。但是当不再需要类和类加载器时,内存会自动释放。如果您怀疑ClassLoader存在内存泄漏,则只需要调整此参数。
MetaSpece使用本机内存,内存中的组织使用指针使GC比旧的PermGen内存更快。
不,这意味着JVM像普通的C程序一样使用内存,不要将虚拟内存空间用于java对象。这似乎只是机器限制了内存。如果需要,请注意机器的内存可以交换到磁盘。
如果设置参数MaxMetaspaceSize,则可以获取OutOfMemory,如果不设置此参数,则可以获取进程是否分配所有计算机内存(包括交换空间)。
答案 2 :(得分:6)
默认情况下,MetaSpace是否收集GC?
一旦类元数据使用达到“MaxMetaspaceSize”(默认为"unlimited"
),就会触发死类和类加载器的垃圾收集,因此需要进行适当的监视以限制此类GC的延迟或频率。
即使是PermGen也是通过添加args来收集GC的 -XX:+ CMSClassUnloadingEnabled,那么是什么让MetaSpace比PermGen更好?
主要目标是移除permgen,以便用户无需考虑正确调整它的大小。
MetaSpace基于本机内存,因此它将java对象保留在磁盘而不是VM上?
磁盘不是本机内存,而是存储设备。本机内存,在此上下文中是区域,是从Java堆遗留的进程的内存
甚至MetaSpace也会耗尽内存?
是的,它受到机器内存量的限制。