美文网首页
永久代 以及jdk1.8为什么将其移除?

永久代 以及jdk1.8为什么将其移除?

作者: lenny611 | 来源:发表于2019-08-23 17:18 被阅读0次

永久代
在JDK8之前的HotSpot实现中,类的元数据如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方法表等被保存在永久代中,32位默认永久代的大小为64M,64位默认为85M,可以通过参数-XX:MaxPermSize进行设置,一旦类的元数据超过了永久代大小,就会抛出OOM异常。

虚拟机团队在JDK8的HotSpot中,把永久代从Java堆中移除了,并把类的元数据直接保存在本地内存区域(堆外内存),称之为元空间。

把永久代从Java堆中移除了,并把类的元数据直接保存在本地内存区域(堆外内存)。这样做有什么好处?

有经验的同学会发现,对永久代的调优过程非常困难,永久代的大小很难确定,其中涉及到太多因素,如类的总数、常量池大小和方法数量等,而且永久代的数据可能会随着每一次Full GC而发生移动。

而在JDK8中,类的元数据保存在本地内存中,元空间的最大可分配空间就是系统可用内存空间,可以避免永久代的内存溢出问题,不过需要监控内存的消耗情况,一旦发生内存泄漏,会占用大量的本地内存。

ps:JDK7之前的HotSpot,字符串常量池的字符串被存储在永久代中,因此可能导致一系列的性能问题和内存溢出错误。在JDK8中,字符串常量池中只保存字符串的引用。

相关文章

  • 永久代 以及jdk1.8为什么将其移除?

    永久代在JDK8之前的HotSpot实现中,类的元数据如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、...

  • Java 8 内存划分

    都知道java8移除了永久代,其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据...

  • java GC

    Full GC 就是收集整个堆,包括新生代,老年代,永久代(在JDK 1.8及以后,永久代会被移除,换为metas...

  • java8内存结构变化

    java8移除了永久代,增加了元空间。1)java7以前的版本Hotspot的方法区位于永久代,并且永久代和堆是互...

  • JVM_JMM: MetaSpace 元空间的详解

    Meta Space是JDK1.8引入的,在JDK1.8使用的是方法区,永久代(Permnament Genera...

  • 2-JVM内存结构

    内存结构 方法区 JDK1.7 之前包含1.7 将方法区称为 Perm Space 永久代JDK1.8之后包含1....

  • 元空间

    解释 元空间是jdk1.8之后出现的,之前叫永久代 元空间就是方法区,方法区是JVM的规范,元空间是HotSpot...

  • Java对象回收

    对象分配流程:1、class 加载,数据存放在元空间(已经移除的 JVM 内存之外,原因是大小不好调优,永久代触发...

  • 类模型与Class实例的位置

    1、类模型的位置 加载的类在JVM中创建相应的类结构,类结构会存储在方法区(JDK1.8之前:永久代;JDK1.8...

  • JAVA8中的元空间到底存了什么?

    java8中移除了永久代,新增了元空间的概念。原来的方法区是逻辑划分中的一个区域,对应hotspot jdk6中的...

网友评论

      本文标题:永久代 以及jdk1.8为什么将其移除?

      本文链接:https://www.haomeiwen.com/subject/olitectx.html