jdk1.8 JVM内存模型

Hotspot虚拟机 jdk1.7 JVM内存模型是这样的
在这里插入图片描述
jdk1.8 做出了些改变
在这里插入图片描述
做出的改变有:
jdk1.8取消了永久代,在jdk1.7及之前的Hostspot虚拟机永久代实现了方法,取而代之的是元空间(Metaspace),补充一点:方法区只是JVM规范,方法区为具体实现,元空间也是
绝大多数的类元数据的空间都在本地内存中分配
字符串常量池移至堆内存,其他内容包括类元信息、字段、静态属性、方法、常量等都移动至元空间

本地方法栈 Native Method Stack
与虚拟机栈区别不过是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
也会抛出StackOverFlow,OutOfMemoryError异常

Java堆 Java Heap
对大多数应用来说,这是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,此区域唯一目的就是存放对象实例(包含成员变量)。
Java堆是垃圾收集器管理的主要区域。从回收角度来看,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为新生代和老年代,还可以再细致点有Eden空间,From Survivor空间,To Survivor空间(8:1:1)等。
Java堆可以出于物理上不连续的内存空间中,只要逻辑上是连续的即可
会抛出后OutOfMemoryError异常
老年代:存活较久,大小较大的对象触发Major GC(full GC)

方法区 Method Area
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,有个别名叫Non-Heap(非堆)
习惯在HotSpot虚拟机上开发的开发者来说,很多人愿意把它称为“永久代”Permanent Generation,本质上两者并不等价,用永久代来实现方法区现在看来不是个好主意
Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集,这区域的回收目标主要是针对常量池的回收和对类型的卸载
当方法区无法满足内存分配需求时,会抛出OutOfMemoryError异常
在Java 8中,永久代被彻底移除,取而代之的是另一块与堆不相连的本地内存——元空间(Metaspace)
JDK 8 开始把类的元数据放到本地堆内存(native heap)中,这一块区域就叫 Metaspace,中文名叫元空间。

运行时常量池 Runtime Constant Pool
是方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用。这部分内容将在类加载后进入方法区的运行时常量池中存放
运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性
当常量池无法再申请到内存时会抛出OutOfMemoryError异常
在JDK6时它是方法区的一部分
7又把他放到了堆内存中
8之后出现了元空间,它又回到了方法区。

直接内存 Direct Memory
并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样可在一些场景中提升性能,因为避免了在Java堆和Native堆中来回复制数据
不会受到Java堆大小的限制,会受到本机总内存限制
动态扩展时可能会导致OutOfMemortyError异常

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值