【JVM】 JAVA虚拟机运行时数据区

JAVA虚拟机运行时数据区

java 虚拟机在执行java程序的过程中,会划分为不同功能作用的数据区域:

同虚拟机进程生命周期的数据区域:方法区、堆

同java线程生命周期的数据区域:虚拟机栈、本地方法栈、程序计数器

一、程序计数器

程序计数器(program counter register)是一块较小的内存空间 ,可以看作是当前线程执行字节码的行号指示标,字节码解释器、程序的控制流程 If、while、for 等指令的执行也是依赖程序计数器完成。

多条线程在单核cpu环境下,单核cup同时只能执行一个线程(涉及到cpu时间片、上下文切换),线程切换就是通过程序计数器记录执行位置。

如果当前线程执行java方法,程序计数器记录虚拟机指令字节码指令的地址;如果执行的是Native方法,这个计数器值为空。

程序计数器是唯一一个不会发生内存溢出的区域。

如果是native方法,计数器为空解释:

当执行java方法是,”pc寄存器“执行的是字节码指令地址,实现上可能有两种方式存储:1.字节码地址的偏移量,叫 bytecode index,2.存放java字节码内存地址,叫

 bytecode pointer。对于native方法而言,不是由java字节码构成,所以,jvm规范,如果是native方法,程序计数器的值未定义--可以是任何值。

native 方法执行:

Java线程总是需要以某种形式映射到OS线程上。映射模型可以是1:1(原生线程模型)、n:1(绿色线程 / 用户态线程模型)、m:n(混合模型)。

以HotSpot VM的实现为例,它目前在大多数平台上都使用1:1模型,也就是每个Java线程都直接映射到一个OS线程上执行。此时,native方法就由原生平台直接执行,并不需要理

会抽象的JVM层面上的“pc寄存器”概念——原生的CPU上真正的PC寄存器是怎样就是怎样。就像一个用C或C++写的多线程程序,它在线程切换的时候是怎样的,Java的native方

法也就是怎样的。

 
二、java 虚拟机栈

java虚拟机栈(java virtual machine stacks)与程序计数器一样是线程私有的,与线程的生命周期相同,描述的是java方法执行的内存模型,每个方法执行都会创建一个栈帧(stack fram)用于存储局部变量表、动态链接、操作数栈、方法出口信息,线程的创建和消亡相当与一个方法的出栈与进栈。

局部变量表存放了编译期可知的基本类型(byte、char、short、int、long、float、double、boolean)、引用类型(可能是指向对象的起始地址的引用指针,或是 对象句柄的位置)、returnAdress类型(指向指令字节码地址)。

java虚拟机规定了这个区域的两种异常:1.当请求的深度大于虚拟机栈所允许的深度,抛出StackOverFlowError异常;2.java虚拟机栈可以动态扩容,如果扩容导致内存不够,抛出 OutOfMemoryError异常。

三、本地方法栈

本地方法栈(native method stack)与java 虚拟机栈发挥作用相似,区别是java虚拟机栈是为java方法(字节码)执行的模型,本地方法栈是native方法执行的内存模型,

jvm没有强制规定具体的执行native方法执行的语言、处理方法、数据结构,可以由虚拟机自由的实现。有的虚拟机会把虚拟机栈和本地方法栈合二为一,与虚拟机栈一样。

本地方法栈内存不够时也会抛出 OutOfMemory 异常。


四、堆

java 堆是虚拟机占用内存最多的一块区域,也是所有线程共享的一块区域,主要用于创建对象实例,虚拟机所有对象都会在堆上创建。

java 堆也是垃圾回收处理区域,从垃圾回收角度,现代收集器都是分代回收,分为新生代和老年代;从内存区域角度,将java堆分成多个线程私有的分配缓冲区,但是存储内容没有变化,仍然存对象实例。进一步划分是为了更好的创建实例和更好的回收内存。

根据java虚拟机规范,java堆可以是连续或者不连续的内存空间,类似于磁盘空间,java堆内存空间是可宽展的,可以通过(-xms,或-xmm)控制,当对象分配的空间大于扩展后的内存 空间,抛出 outOfMemoryError 异常。

五、方法区

方法区是存放已被虚拟机加载的类、变量、静态变量、即时编译后的代码信息,方法区也是线程共享的区域。

java虚拟机规范把方法区描述为堆的一个逻辑部分,但方法区有别名叫“非堆”,目地是为了与堆区分。

java虚拟机规范对方法区的限制还是比较宽松的,可以像堆一样不需要连续的内存空间,并且可扩展,垃圾回收也是可选择的,这个区域主垃圾回收的主要目标是常量池的

回收和对类型的卸载,若不选择垃圾回收,也不是像“永久代”名字一样数据永久不回收,只是回收规则比较苛刻,回收不理想,为避免造成OutOfMemory异常,还是有必要使用垃圾回收器。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值