JVM运行时数据区域(JVM内存模型)

    Java虚拟机在执行Java程序时会把它管理的内存划分为若干个不同的数据区域,这些区域各有用途,有的会随着虚拟机进程的启动而一直存在,有的会依赖用户线程的启动和结束而创建和销毁,由此可分为线程共享线程私有的两部分,如图所示(来源自百度百科),下面将进行一一介绍。

                  

程序计数器

       程序计数器是一块内存较小的区域,它是线程私有的,是所属线程执行的Java字节码的行号指示器。字节码解释器在工作时就是通过改变程序计数器来记录下一条需要执行的字节码指令

       需要注意的是,若当前执行的线程是本地(Native)方法,则程序计数器记录的是空值(Undefined)。

       程序计数器是唯一一个不会发生OOM(OutOfMemoryError)的区域。

Java虚拟机栈

       虚拟机栈也是线程私有的,他描述的是Java方法执行的内存模型。每个方法被执行时,JVM会创建一个栈帧,用于记录对应方法的局部变量表,操作数栈,动态连接,方法出口等信息。方法从调用到执行完毕对应着一次栈帧进栈和出栈的过程。

       其中局部变量表存储的是编译期可知的各种基本数据类型(boolean,byte,short,int,long,float,double)、对象引用(存储的不是一个对象,而是一个引用对象的起始地址或指向对象的句柄)和returnAddress类型(指向一条字节码指令的地址)。

       当线程申请栈深度大于虚拟机允许的栈深度时,会抛出StackOverflowError(栈溢出)异常。而当栈进行动态扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。

本地方法栈

       本地方法栈的作用和虚拟机栈和相似,最大的区别是虚拟机栈是为Java方法服务的,而本地方法栈是为Native方法服务的,它也是线程私有的。本地方法栈也会发生StackOverflowError和OutOfMemoryError异常。

Java堆

       Java堆是一块被所有线程共享的内存区域,他也是最大的一块。他的唯一目的是存放对象实例,因为Java程序中频繁的对象创建及回收,这也是被垃圾收集器管理的内存区域,进行垃圾回收(GC)。

      当堆中的内存不够进行实例分配且无法再扩展时,会抛出OutOfMemoryError异常。

方法区

       方法区也是各个线程共享的内存区域,它主要用于存储被虚拟机加载的类信息(类的版本,字段,方法,接口等常量静态变量即时编译器编译后的代码缓存等数据。

       运行时常量池是方法区的一部分,字节码文件中的常量池表(用于存放编译期生成的各种字面量与符号引用)进行类加载后就存放在运行时常量池。

      当方法区内存无法满足新的分配需求时,也会抛出OutOfMemoryError异常。


       本文是在阅读了《深入理解Java虚拟机》后做的学习笔记,是对JVM运行时数据区域的一个概括,具体细节如对象在JVM中创建的细节和JVM堆的GC机制会在之后的文章中进行阐述。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值