首页 > 编程知识 正文

元空间和方法区,方法区和元空间区别

时间:2023-05-03 11:32:21 阅读:189852 作者:293

图为JVM的方法区域、永久空间、元空间三者的不同

方法区:(逻辑上)

逻辑上是JVM规范,所有虚拟机都必须遵守。

包括用于存储类的信息、常量池、方法数据和方法代码,这些信息由JVM的所有线程共享。

永久代:(方法区的实现、JDK7及之前、主要是和元空间对比)

PermGen是PermGen space,全名是Permanent Generation space,是内存的永久保存区域。

PermGen space是HotSpot虚拟机根据JVM规范在方法区域中实现的,只有HotSpot具有PermGen space。 像Jrockit(Oracle )、J9 (IBM )这样的虚拟机有方法区域,但没有PermGen space。 PermGen space是JDK7之前的HotSpot虚拟机在方法区域的落地安装。 已在JDK8下删除。 ‘ Metaspace(元空间、JDK8及之后):

http://www.Sina.com/http://www.Sina.com /

删除permgen「persistentgeneration "从JDK7开始。 例如,在JDK7中从永久层代中删除的字符串内部池。 在JDK8发表之前宣告PermGen (永久一代)的结束。 实际上,删除PermGen的工作是从JDK7开始的,永久代的一些数据已经迁移到了Java Heap或Native Heap中。 但是,永久世代还存在于JDK7中,并没有完全被去除。 例如,字面量(interned strings )转移到Java heap; 类的静态变量(class statics )为Java heap; 符号引用是Native heap; 实现JDK版本的方法区域运行时常量池的位置JDK6PermGen space (永久) PermGen space (永久)永久) JDK7PermGen space (永久) Heap )堆) JDK8metaspace

对于JDK8,方法区域是Metaspace (元空间)。

这篇文章写得很好。 JVM的方法论、永久世代(PermGen space )、元空间)的三个差异

元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存

表面上是为了避免OOM的异常。

通常,使用PermSize和MaxPermSize设置持久层代的大小会确定持久层代的上限,但使用缺省值容易遇到OOM错误,因为您并不总是知道应该设置多少合适。

使用元空间时,可以加载的元数据类的数量由系统的实际可用空间控制,而不是MaxPermSize。

更深层的原因还是集成HotSpot和JRockit的代码。 JRockit没有永久的世代。 另外,开发承运人也不需要设定永久世代的大小,但运行良好。 另外,也不需要担心执行性能的问题,在覆盖的测试中,程序的启动和执行速度的降低在1%以下,但是这样的性能损失是以更大的安全保障换取的。

由于经常出现持久性内存不足或内存泄漏的情况,出现了异常的Java.lang.out of memory error 3360 perm gen。 字符串存在于永久的世代中,容易发生性能问题和内存溢出。 因为类和方法的信息等很难确定大小,所以很难指定永久世代的大小,过小的话容易发生永久的世代溢出,过大的话容易发生旧的世代溢出。 永代会位GC带来不必要的复杂性,而且回收效率低。 Oracle可能会把HotSpot和JRockit合二为一。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。