东莞市做网站的最好的是哪家的,wordpress 百度 seo,在国外做电商网站,网站建设及维护合同笔者近期在面试的时候被问到了这个问题#xff0c;元空间也是Java8当时的一大重大革新#xff0c;之前暑期实习求职的时候有专门看过#xff0c;但是近期秋招的时候JVM相关的内容确实有点生疏了#xff0c;故在此进行回顾。 结构
首先#xff0c;我们应了解JVM的堆结构元空间也是Java8当时的一大重大革新之前暑期实习求职的时候有专门看过但是近期秋招的时候JVM相关的内容确实有点生疏了故在此进行回顾。 结构
首先我们应了解JVM的堆结构主要有两个版本及Java7以及Java8。 元空间的前身-永久代Permanent Generation
JAVA永久代的演化
JDK7开始字符串常量和符号引用等就被移出永久代字符串字面量迁移至Java堆 /符号引用转移到了native heap。JDK8永久代被彻底地移出了JVM取而代之的是元空间MetaSpace把类的元数据放到本地化的堆内存native heap中这块区域就叫Metaspace。
JDK 1.7 为什么要将字符串常量池移动到堆中
主要是因为永久代方法区实现的 GC 回收效率太低只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收将字符串常量池放到堆中能够更高效及时地回收字符串内存。
作用
JVM的MetaSpace存储JVM的元信息而且是在堆外存储。主要涉及以下内容
JVM中类的元数据在Java堆中的存储区域Java类对应的HotSpot虚拟机中的内部表示也存储在这里类的层级信息字段名字方法的编译信息及字节码变量常量池和符号解析
注意到堆外内存就是把内存对象分配在堆新生代老年代永久代以外的内存这些内存直接受操作系统管理而不是虚拟机这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。
理论上以上信息占用的内存空间在服务启动后就会比较稳定并不会出现上文中提到的一直增长的甚至导致OOM的情况出现。 回到正题元空间的引入是为了替代原来使用的 PermGen 区域PermGen 区域主要用于存储永久代Permanent Generation中的类信息和常量池信息。随着Java应用程序对内存需求的不断增加PermGen 区域经常会出现内存泄漏和 OutOfMemoryError 的问题因此引入了元空间来解决这些问题。
元空间的大小可以通过参数配置的方式指定。在启动JVM时可以使用以下参数来指定元空间的大小
-XX:MaxMetaspaceSize指定元空间的最大大小单位是字节。
-XX:MinMetaspaceSize指定元空间的最小大小单位是字节。
-XX:InitialMetaspaceSize指定元空间的初始大小单位是字节。
这些参数可以通过命令行或配置文件的方式传递给JVM。在默认情况下元空间的大小是动态调整的根据应用程序的需要自动扩展或缩小。当元空间快要达到最大或最小大小时JVM会尝试进行垃圾回收来释放不再使用的类信息和常量池信息。 参考资料
JVM Metaspace OOM的排障以及原理分析 - 掘金
https://www.cnblogs.com/snowwhite/p/9532311.html
Java内存区域详解重点 | JavaGuide(Java面试 学习指南)