注册 登录
  • 欢迎来到幻月小筑

java内存区域与内存溢出异常

深入理解jvm seal 18次浏览 0个评论

一、运行时数据区域

    jvm在执行java程序时会把它所管理的内存划分成若干个不同的数据区域,这些区域有着不同的功能

1.程序计数器(pcr)

    pcr是一块较小的内存,可以把它看作当前线程的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器来选择要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来实现

   在多核处理器中,每个处理器都会执行一条线程,因此每个线程都需要有一个独立的计数器来保证线程的执行,各个线程之间的计数器互不影响,独立存储。

   如果正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是native方法,这个计数器的值则为空(Undefined)。

  此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2.java虚拟机栈

   java虚拟机栈也是线程私有的,它的生命周期与线程相同。java虚拟机栈是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)用于存储局部变量,操作数栈,动态链接,方法出栈口等信息。平时所说的栈就是这个java虚拟机栈,不过虚拟机栈更细节性

  如果线程请求的栈深度大于虚拟机锁允许的深度,会抛出StackOverflowError异常,若果虚拟机栈可以动态扩展,线程请求栈深度大于扩展后的栈深度,则会抛出OutOfMerroyError异常

3.本地方法栈

  知道此战的作用,得去科普一下什么是本地方法(native method),本地方法栈和java虚拟机栈的作用非常相似,只不过是处理JVM执行的native方法,本地方法栈也会抛出StackOverflowError和OutOfMerroyError异常

4.堆

   堆是线程共享的一块内存区域,在虚拟机启动时创建,此区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存(不是所有)。

5.方法区

   和java堆一样,是各个线程共享的内存区,用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。逻辑和堆相似,但实际不是堆。

  当方法区无法满足内存分配需求时,将会抛出OutOfMerroyError异常

6.运行时常量池

  用于存放编译时生成的各种字面量和符号引用。。。

。。。。未完待续,待修改

 


幻月小筑丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java内存区域与内存溢出异常
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到