Java虚拟机运行时内存结构

任何运行时的程序或者数据都需要依靠内存作为存储介质,否则程序将无法正常运行。

线程共享内存区:堆区、方法区和运行时常量池  线程私有内存区:PC寄存器、java栈和本地方法栈

Java堆区和方法区在jvm启动时被创建,并且它们在实际内存空间中可以是不连续的。

1. Java堆区

Java堆区是一块用于存储对象实例的内存区,同时也是GC执行垃圾回收的重点区域,因此GC性能在大内存的使用上很容易成为性能瓶颈,而堆外存储技术与逃逸分析和栈上分配优化技术的出现则降低了GC回收频率和提升GC回收效率,解决了大内存使用问题。注:堆的大小在jvm启动时就已经设定好(可通过-Xms-Xmx设置堆区起始内存与最大内存)

2. 方法区

方法区存储了每一个Java类的结构信息,如:运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容以及类、实例、接口初始化时需要用到的特殊方法等数据,如果没有显示要求不对方法区进行内存回收的情况下,GC的回收目标仅针对方法区中的常量池和类型卸载。

3. 运行时常量池

常量区存储的为编译期就已经明确的数值字面量到运行期解析后才能够获得的方法和字段引用,当所需的内存大小超过方法区所能够提供的最大值时,运行时常量池就会抛出OutOfMemoryError异常

4. Java

Java栈即Java虚拟机栈,与PC寄存器一样都是线程私有,并且生命周期与线程的生命周期保持一致。Java栈用于存储栈帧,而栈帧,而栈帧中所存储的就是局部变量表、操作数栈以及方法出口等信息。Java栈中的局部变量表就是用于存储各类原始数据类型、对象引用以及returnAddress(指向一条虚拟机指令的操作码)类型。若Java栈被设定为固定大小的内存,一旦线程请求分配的栈容量超过jvm所允许的最大值时,jvm将会抛出一个StackOverflowError异常

5. PC寄存器

如果当前线程所执行的方法是一个Java方法,那么PC寄存器就会存储正在执行的字节码指令地址,反之如果是native方法,这时PC寄存器的值就是空,多线程为了能够准确的记录各个线程正在执行的当前字节码指令地址,则为每个线程都分配一个PC寄存器,这样一来各个线程便可以独立计算,不会出现互相干扰。Jvm的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令,唯一没有明确规定需要抛出内存溢出异常的jvm内存区。

6. 本地方法栈

本地方法栈用于支持本地方法(C/C++编写的方法)的执行,和Java栈的作用类似,若虚拟机不支持native方法,也不依赖于传统栈,则可以无需实现本地方法栈。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值