JDK1.8内存模型

Posted chenheblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK1.8内存模型相关的知识,希望对你有一定的参考价值。

程序计数器

记录字节码指令地址,占用空间很小,基本无异常抛出

本地方法栈

native方法区

方法区

所有线程共享,主要存储类的信息,常量池,方法数据,方法代码。

堆内存

JVM所有线程共享,所有对象和数组都在堆上进行分配,这部分内存可通过GC回收,申请不到内存空间会抛出OutOfMemoryError

虚拟机栈

线程私有,随线程的创建而创建,栈里面存放“栈帧”,每个方法会存放一个栈帧,栈帧中存放局部变量表、操作数栈、方法出口。会抛出StackOverflowError,OutOfMemoryError

PermGen 非永久代

常见的异常java.lang.OutOfMemoryError: PermGen space,其实指的是方法区,但是方法区和PermGen又有本质区别。前者是JVM规范,后者是JVM规范的一种实现,并且只有HotSpot才有PermGen space
JDK1.8已经用Metaspace取代PermGen

Metaspace(元空间)

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不给Metaspace与PermGen最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此元数据大小仅受本地内存限制

-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整;如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize.最大空间默认没有限制。

为什么要做PermGen向Metaspace转换

1.字符串存在永久代中,容易出现性能问题和内存溢出。
2.类及方法的信息等比较难确定大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大容易导致老年代溢出。
3.永久代会为GC带来不必要的复杂度,并且回收效率偏低。
4.Oracle 可能会将HotSpot 与 JRockit 合二为一。

以上是关于JDK1.8内存模型的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.8内存模型

jdk1.8的JVM内存划分模型,堆和栈的区别

Java堆内存模型

jvm 03-java堆内存模型

JVM内存模型那些事

java JVM内存区域模型