JVM运行时数据区域

JVM运行时的内存区域分为:

程序计数器

虚拟机栈

本地方法栈,

方法区,

常量池,

直接内存区域

这些区域的存储内容作用:

添加个思维导图供参考,里面没有列出直接内存和运行时常量池

 

1.程序计数器

   程序计数器是线程私有的,当前线程所执行的字节码行号指示器。字节码解析器通过改变这个计数器来选取下一条需要执行的字节码指令。

  执行java方法的时候,保存的是正在执行的虚拟机字节码指令地址,执行本地方法的时候保存的是空

  在jvm内存模型中唯一一个没有OOM异常的区域

详细代码讲解:

LINK:https://blog.csdn.net/leaf_0303/article/details/78953669

2.虚拟机栈

  也是线程私有的,生命周期与线程相同。此块区域描述的是方法执行的内存模型。每一个方法从调用到执行完成在虚拟机栈中描述的都是栈帧的入栈和出栈,虚拟机栈中的保存的是局部常量表,操作数栈,动态链接和方法出口等

  很多时候,我们在描述jvm内存的时候,喜欢说栈和堆,这样的描述是很粗糙的,而这里的栈就是指我们的虚拟机栈

  虚拟机栈中会抛出stackOverFlowError异常和OOM异常。线程请求的栈的深度大于虚拟机允许的栈的深度的时候,会抛出SOF异常。同样的;当扩展的时候无法申请到足够的内存的时候,会抛出OutOfMemoryError异常

  注意两个知识点:局部变量表中保存有基本数据类型,对象引用和returnAddress类型;long和double占用2个局部变量空间,其他的占用一个局部变量空间

LINK:https://www.cnblogs.com/manayi/p/9293302.html

3.本地方法栈

  本地方法栈与虚拟机栈类似。差别在于,本地方法栈为虚拟机的本地方法服务。在jvm规范中,本地方法栈中的方法实现和数据类型没有做严格的规定,所以本地方法栈可以自由的实现,包括不使用java语言。在Hotspot中,本地方法栈被合并到了虚拟机栈中。本地方法栈也会抛出StackOverFlowError异常和OutOfMemoryError异常

4.java堆(Heap)

  java堆是jvm中最大的一块区域,此区域是共享的,在虚拟机初始化的时候创建的。java堆中保存着具体的java对象实例,几乎所有的对象实例都保存在这个区域中。java虚拟机规范中规定,所有的数组和对象实例都保存在java堆中,但是随着JIT编译器的发展和逃逸分析技术的逐渐成熟,这个也成了并非绝对的。

  jvm规范中,java堆在物理内存上并不一定要是连续的,只要保证在逻辑上是连续的即可

  java堆的大小可以通过-Xmx和-Xmn来设定最大最小值,当然也可以设置成固定大小的

  在这个区域中,当没有足够内存分配对象的时候(GC之后),则会抛出OutOfMemoryError异常

LINK: https://www.iteye.com/blog/286-1931174

5.方法区(Method Area)

  方法区与java堆一样,是线程共享的区域,此区域中保存着类信息,变量,静态变量,即时编译器编译后的代码等数据。在java虚拟机规范中,也将方法区描述为java堆的一部分,但是方法区还有另一个名字叫Non-Heap,目的也是为了与java堆区分开

  hotSpot上,习惯将这个区域叫永久代(Permanent Generation),因为hotspot团队将GC分代收集扩展到这个区域,或者是使用永久代来实现了方法区,但是本质上这两者是不能对等的

  java虚拟机规范对于方法区的限制也是很宽松的,如存储的不需要物理上连续的,只要逻辑上连续即可,与java堆一样。

  这个区域的GC是很少的,因为要回收的内容要求太苛刻,造成回收的效率不高,但是并不意味着就不进行GC,只是回收的成绩不够满意

   此区域也会出现OutOfMemoryError异常

6.运行时常量池

  运行时常量池是方法区的一部分,保存着编译期生成的各种字面量和符号引用

  运行时常量池相对于class文件常量池,多了动态性。java并不要求常量只有在编译器产生,运行期间也有可能将常量写入运行时常量池中,如String的intern方法

  此区域与方法区一样,会跑村OutOfMemoryError

LINK: https://www.cnblogs.com/natian-ws/p/10749164.html

7.直接内存

  直接内存并不是虚拟机运行时数据区域的一部分,也不是java虚拟机规范中的内存区域  自jdk1.4之后,加入了NIO,引入

了一种基于通道与缓存区的I/O方式,可以使用直接内存,提高了效率,因为使用直接内存便不用将对象从直接内存拷贝到堆中一样,减少了交互,提升了体验

  此区域也会抛出OutOfMemoryError异常

LINK: https://www.cnblogs.com/qingchen521/p/9177357.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值