Java运行时数据区域


1、程序计数器(program counter register)

定义:一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。

线程:私有

异常:无

2、Java虚拟机栈(java virtual machine stacks)

定义:Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)用于存储 局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

存储:八种基本数据类型(boolean、byte、char、short、int、long、float、double)、对象引用(引用指针)和returnAddress(指向一条字节码的指令地址)

线程:私有

异常:如果线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError;如果虚拟机栈动态扩展时无法申请到更多的内存,抛出OutOfMemoryError。

3、本地方法栈(Native Method Stack)

定义:与虚拟机栈作用非常相似,不同的是虚拟机栈执行的是Java方法(字节码),本地方法栈为虚拟机使用到的native方法服务。注:本地方法栈和虚拟机栈可以合并,例如Sun Hotspot虚拟机。

4、Java堆(Java heap)

定义:Java堆是虚拟机所管理的内存中最大的一块。被所有线程共享的一块内存区域,在虚拟机启动时创建。它是GC的主要区域。

存储:对象实例

线程:共享

异常:OutOfMemoryError

5、方法区(Method area)

定义:与java堆一样,是各个线程共享的区域。别名“Non-heap”(非堆),目的是与java堆分开。

注:本质上方法区不等价于“永久代”。因为Hotspot设计团队将GC分代收集扩展至方法区,使用永久代实现了方法区,其他虚拟机不存在永久代的概念,如(BEA JRockit、IBM J9)等。

JDK1.7的HotSpot中已经将字符串常量池在永久代中移出。

存储:虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

线程:共享

6、运行时常量池(Runtime Constant Pool)

定义:是方法区的一部分,用于存放编译期生成的各种字面变量和符号引用,这些是在类加载后进入方法区的运行时常量池中存放。

存储:字面变量和符号引用

线程:共享

异常:OutOfMemoryError

7、直接内存(Direct Memory)

不是虚拟机运行时数据区域的一部分,也不是java虚拟机规范中定义的内存区域。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值