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