JVM运行时数据区域

java虚拟机运行Java程序时会将它所管理的内存划分为若干个不同的数据区域,这些数据区域都拥有各自的创建和销毁时间,有的区域在jvm进程启动时就存在,有些区域伴随线程的创建而创建;
java虚拟机运行时数据区域:

这里写图片描述
1)、程序计数器:是一块较小的内存空间,用于记录当前线程所执行的字节码的行号,该区域线程私有,每个线程都拥有一个独立的程序计数器区;
2)、java虚拟机栈:描述java方法执行时的内存模型,每个java方法执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,方法出口等,每个方法执行相当于一个入栈和出栈的过程,该区域线程私有,当线程请求栈的深度大于虚拟机所允许的深度,会抛出StackOverflowError异常,如果虚拟机支持栈的动态扩展,扩展过程中无法申请足够的内存,会抛出OutofMemoryError异常;局部变量表用于存储编译器可知的基本数据类型,对象引用类型(指向具体对象地址的引用指针)
3)、本地方法栈:描述native方法执行时的内存模型,其作用和功能与java虚拟机栈类似,线程私有;
4)、堆:堆内存是运行时数据区中最大的一个数据区域,线程共享,主要用于存储对象实例,几乎所有的对象实例和数组创建都在堆中分配内存;线程共享的对内存可能划分出多个线程私有的分配缓冲区。如果堆中没有足够的内存存放对象实例,会抛出OutOfMemoryError异常
5)、方法区:用于存放被JVM加载的类信息,常量,静态变量,及时编译器编译后的代码等数据,该区域线程共享,该区域的内存回收主要类信息的卸载和常量池的回收。常量池主要存储字面量和符号引用,字面量:文本字符串,final修饰的常量等;符号引用:类或接口的权限定名、字段的名称或描述符、方法的名称或描述符;JVM运行时,需要在常量池中获得对应的符号引用,再在类的创建或运行时解析、翻译到具体内存地址中。Class字节码文件中前4个字节CA FE BA BE(魔数)标识文件能够被虚拟机加载,后两个字节是此版本号,接着两个字节为主版本号,接下来一个字节为常量池入口,入口后的一个字节表示常量池中字面量或者符号引用的个数,常量池中的字面量或引用字符的组成=1个字节的tag+2个字节的name_index, tag描述字面量或符号引用的类型,name_index指向常量池中类型为tag代表的类型的字面量或常量。eg: 07 0002:其中07表示类或接口的符号引用,0002表示指向常量池中的第二项常量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值