浅谈java内存模型

运行时数据区域
java 虚拟机在执行java 程序的时候将所管理的内存划分为若干个不同的数据区域,用于不同的场景,有的区域随着虚拟机进程的启动而存在,有些区域随着用户线程的启动和结束创建而销毁根据
《Java 虚拟机规范(Java SE 7版)》规定,Java虚拟机所管理的内存将会包括一下几个运行时数据区域:
在这里插入图片描述

  • 程序计数器

程序计数器(Program Counter Register) 是一块比较小的内存区域,它可以看做当前线程所执行的字节码的行号指示器。在虚拟机的概念模型当中(仅仅是概念模型,各种虚拟机可能会有不同的高级的处理方式),字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指示,分支,循环,跳转,异常处理,线程恢复,等等基础功能都需要依赖这个计数器来完成

由于java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,
在任何一个确实的时刻,一个处理器(或者说多核处理器的一个内核)都只会执行一条线程中的指令,因此为了线程切换后能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器(PC 寄存器),各线程之间计数器互不影响,独立储存 ,我们称这类内存区域为"线程私有"的内存

如果线程正在执行一个java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是一个native方法,这个计数器值则为空(undefined)。
此内存区域是唯一一个在Java 虚拟机规范当中没有规定任何 OutOfMemoryError情况的区域。

  • Java 虚拟机栈
    与程序计时器相同,Java虚拟机栈也是线程私有的,他的生命周期于线程相同,随着线程的创建而诞生线程的销毁而死亡。虚拟机栈描述的是Java方法执行的内存模型,当一个线程创建后会创建一个栈,每个方法在执行的同是会创建一个栈帧(Stack Frame) 用户存储局部变量表,操作数帧,动弹连接,方法出口信息等,调用方法后会将线帧压入栈的底部,每一个方法从调用到执行完毕,都是对应栈帧在虚拟机入栈出栈的过程。
    PS:栈帧又分为1.本地变量表(存放方法内的局部变量(基本数据类型和引用类型的引用) 这里可以解释值类型传递和引用类型传递的原理) 2.操作数栈 3.动态链接 4.返回地址

  • 本地方法栈
    本地方法栈于虚拟机栈所发挥的作用十分相似(JDK1.8 的虚拟机HotSpot 合并了本地方法栈和虚拟机栈) 他们的区别就是虚拟机栈执行的是Java的方法,本地方法栈则是执行外步的Native方法,在虚拟机规范当中并没有对本地方法栈使用的语言以及数据结构进行规定,于虚拟机栈一样,本地方法栈也会抛出StackOverFlowError和OutOfMemoryError异常

  • 方法区
    方法区于堆一样,是各个线程共享的内存区域,他是储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译过后的数据,虽然Java虚拟机规范吧方法区描述的和堆一个逻辑部分,但是他有一个别名叫着Non-Heap(非堆)目的就是为了和Java堆区分开。
    JDK6之前字符串常量池也储存在方法区当中 1.7后字符串常量池移入到Heap当中,1.8删除方法区,取而代之的是Metaspace。

  • 运行时常量池(JDK7以前)
    运行时常量池是方法区的一部门Class 文件里面类的版本、字段、方法、接口等信息外,还有一项信息是常量池(Constant pool Table) ,用于存储编译器生成的各种字面量以及符号引用,这部分内容将类加载后进入方法区的运行时常量池中存放。
    PS:Integer 、ByteCache 、ShortCache 、LongCache 等基本数据包装类得缓存值都储放在这里
    Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。

    1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

    2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
    PS:1.7后字符串常量池移入置Heap区域

  • Metaspace

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值