码迷,mamicode.com
首页 > 其他好文 > 详细

JDK1.8内存模型

时间:2019-07-23 14:58:59      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:内存   永久   lan   地方   perm   回收   rac   nat   本地   

程序计数器

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

本地方法栈

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内存模型

标签:内存   永久   lan   地方   perm   回收   rac   nat   本地   

原文地址:https://www.cnblogs.com/chenheblog/p/11231426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!