JVM 的内存模型主要包括程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)、堆(Heap)和方法区(Method Area)。
创新互联公司是专业的肃宁网站建设公司,肃宁接单;提供成都做网站、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行肃宁网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
方法区(Method Area)是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
具体来说,方法区用来存储以下数据:
方法区只是 JVM 规范中定义的一个概念,针对 Hotspot 虚拟机,Java8 之前使用永久代(Permanent Generation,简称 PermGen)实现,而 Java8 之后使用元空间(Metaspace)实现。
JDK8 之前可以通过 -XX:PermSize 和 -XX:MaxPermSize 来设置永久代大小,JDK8 之后,使用元空间替换了永久代,改为通过 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 来设置元空间大小。
永久代的空间是有限制的,可以通过 -XX:PermSize 设置永久代初始容量,通过-XX:MaxPermSize 设置永久代最大容量。
但是当加载过多的类或者常量的时候,就可能导致永久代的空间不足,抛出 java.lang.OutOfMemoryError: PermGen space 异常。尤其是web应用会使用很多框架,这些框架会动态加载很多基础类,更容易导致OOM。
永久代中的类信息一般是在应用程序运行期间不会发生变化的,因此,如果开启了永久代的垃圾回收,就会造成大量的垃圾回收操作,导致垃圾回收效率低下,甚至会引起应用程序的暂停。
此外,由于永久代主要存放 JVM 加载的类信息等永久存在的数据,这使得它在垃圾回收过程中的回收效率相对较低。在某些情况下,频繁触发的 Full GC 不仅无法有效回收永久代空间,还会严重影响 JVM 的性能。
永久代的大小一旦被设置,就无法动态调整,如果预估错误,就可能导致浪费内存或内存不足的问题。
在永久代中,常量池是一个非常重要的部分,但是其中的常量无法被回收,即使这些常量已经不再被使用,也无法被垃圾回收器回收,这会浪费内存。
元空间(Metaspace)是 Java8 中引入的一个新概念,用来替代原来的永久代。与永久代不同,元空间并不在虚拟机中,而是存储在本地内存(Native Memory)。
从 Java7 已经开始逐步移除永久代,在Java7中把 interned Strings 、 class statics 和 String Pool 从永久代移到堆中。在 Java8 中彻底移除了永久代,把将类的元数据信息、常量、静态变量、即时编译器编译后的代码从永久代中移到了元空间中。
与永久代相比,使用元空间使用方法区具有以下优点:
尽管元空间解决了永久代的一些问题,可能也同时引入了一些新问题:
因此,虽然元空间为 JVM 的内存管理带来了新的可能,但也带来了新的挑战。为了充分利用元空间的优势,开发者需要理解其工作原理,掌握正确的使用和调优方法。
Java8 选择使用元空间(Metaspace)替代永久代(PermGen)是 JVM 内存模型的一次重大改进。解决了永久代面临的空间限制、低效的垃圾回收、以及复杂的内存管理等问题。元空间利用本地内存,能够动态调整大小,提供了更大的空间来存储类元数据,也更好地适应了大型、模块化应用的需求。
但是元空间也引入了一些新问题。如何避免本地内存溢出,如何制定有效的内存管理和调优策略,都是开发者需要重新考虑的问题。
标题名称:JVM高阶面试:Java8为什么使用元空间替换永久代?
分享链接:http://www.shufengxianlan.com/qtweb/news27/148377.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联