【jvm】jvm区域划分

jdk版本:jdk7
概述*

jvm在java程序运行中会把内存区域划分成若干区域进行管理,每个区域的创建、销毁和功能各不相同。 其中方法区和堆是所有线程共享的数据区,栈(虚拟机栈和本地方法栈)和程序计数器是线程隔离的。

1.程序计数器(Programmer Counter Register)

  • 功能:用来记录当前线程所执行的字节码行号,如果是native方法。计数器为undefined
  • 内存空间:很小,相对于其他区域可以忽略
  • 线程私有
  • 内存溢出异常:不存在,是jvm中唯一没有规定内存溢出情况的区域。
    理论上来说,字节码解释器通过程序计数器选取下一条需要执行 的字节码指令,循环、跳转、异常处理、线程恢复等都需要。程序计数器是线程私有的,各条线程之间计数器相互独立。

2.jvm栈(Java Virtual Machine Stack)

  • 功能:java方法执行的内存模型,每个方法执行的时候都有一个栈帧,一个方法从调用到执行完毕,对应着一个栈帧从入栈到出栈的过程。栈帧中存储着局部变量表,方法出口等信息,其中局部变量表的内存大小是在程序编译期间就完成分配的,所以当进入一个方法的时候,栈帧中分配多少空间给局部变量是完全确定的,方法运行期间不会更改局部变量表的大小。
  • 内存空间:
  • 线程私有,生命周期和线程相同
  • 内存溢出异常:
    1)线程请求栈的长度>jvm允许的深度,StackOverflowError异常
    2)通常来说jvm是允许动态扩展的,如果动态扩展申请不到需要扩展的内存空间,就会报OutOfMemoryError异常

3.本地栈(Native Method Stack)

4.堆(Heap)

  • 功能:堆的唯一目的就是存放对象实例,最初jvm规范上所有实例对象和数组都要在堆上分配,但是随着JIT编译器和逃逸分析技术的发展,这个规范变得不那么绝对了。
  • 内存空间:
  • 线程共享,堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB),这个划分是为了更好的垃圾回收,更快的分配内存,存储的仍然是实例对象。
  • 内存溢出异常:堆内存是逻辑连续,不是物理连续,一般来说都是可以扩展的,当堆没有内存完成实力分配,且没有办法扩展的时候,就会报出OutOfMemoryError异常。

5.方法区(Method Area)

  • 功能:方法区是用来存储jvm加载的类信息、常量、静态变量、即时编译器编译后的代码。
  • 内存空间: 。在Hotspot在1.7之前,GC回收分代会用永久代实现方法区,但这种方式并不好,由于永久代的-XX:MaxPermSize的上限问题,会出现内训溢出,还会由于部分方法(如:string.intern())。JDK1.7的Hotspot把原本放在永久代的字符串常量池移出。
  • 线程共享,和堆一样。但是方法区有个别名为Non-Heap。
  • 内存溢出异常:方法区无法满足内存分配的时候,报出OutOfMemoryError异常。

6.运行时常量池(Runtime Constant Pool)
功能:它其实是方法区的一部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值