深机笔记 - 01《Java虚拟机规范(JavaSE7版)》运行时数据区域

2.2节
《Java虚拟机规范(JavaSE7版)》规定Java虚拟机管理的内存包括以下几个运行时数据区域: 
 
1. 程序计数器
线程私有,内存空间较小,可看做当前线程执行字节码(分支、循环、跳转、异常处理、线程恢复)的行号指示器
若执行Java方法则计数器记录字节码指令地址,若执行Native方法则计数器为Undefined
无OutOfMamaryError情况
2. 虚拟机栈
线程私有,生命周期与线程相同
描述Java方法执行的内存模型:一个方法执行时创建一个栈帧存储局部变量表、操作数栈、动态链接、方法出口等信息
方法调用、执行过程对应栈帧入栈、出栈过程。
局部变量表存放编译期可知的基本数据类型、对象引用和returnAddress类型,所需内存空间在编译期完成分配,方法运行时大小不变
有StackOverflowError、OutOfMamaryError异常
3. 本地方法栈
与虚拟机栈相似,区别是虚拟机栈为执行Java方法服务、本地方法栈为执行Native方法服务
虚拟机规范中对此区域无强制规定,Sun Hotspot虚拟机将本地方法栈、虚拟机栈合二为一
4. 堆
线程共享,内存空间最大,虚拟机启动时创建,存放对象实例
垃圾收集器管理的主要区域,可细分为新生代、老年代,新生代可再细分为Eden、From Survive、To Survive空间
从内存分配角度看,可划分出多个线程私有分配缓冲区
不要求物理上连续,要求逻辑上连续,可选择固定大小或可扩展
有OutOfMamaryError异常
5. 方法区
线程共享,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
对于Hotspot可称为永久代,其他虚拟机无此说法,JDK1.7 Hotspot已把存放于永久代的的字符串常量池移出
不要求物理上连续,要求逻辑上连续,可选择固定大小或可扩展。
有OutOfMamaryError异常
5.1. 运行时常量池
方法区的一部分。存放已加载Class文件中的常量池(符号引用、直接引用)
具备动态性,运行期间可存入新常量,如String.intern()

相关:
直接内存
非虚拟机运行时数据区,Java虚拟机规范中未定义
有OutOfMamaryError异常
使用Native函数库分配堆外内存,可避免在Java堆和Native堆间来回复制数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值