java虚拟机运行时数据区

时间:2022-04-06 09:37:09
了解java内存区域首先看一下java虚拟机运行时数据区,如下图所示:
java虚拟机运行时数据区
我们首先了解一下java虚拟机运行时数据区各部分的存储信息和运行信息.
        1,程序计数器
                程序计数器也被叫做字节码行号指示器,它是在JVM中仅占一片较小的内存区,如名,它的主要作用就是指向当前运行线程的下一条运行字节码指令.我
们知道java虚拟机是可以多线程运行的,但是本质上还是通过线程执行切换的方式进行.为了避免程序计数器执行混乱,因此程序计数器是线程私有的.
        2,Java虚拟机栈
                和程序计数器一样,虚拟机栈也是线程私有的.每一个线程都是一个方法,而每一个方法都是一个独立的栈帧,栈帧中保存着方法的局部变量表 操作数
栈 动态链表以及方法出口等信息.一般情况下,虚拟机栈其实就是指的方法的局部变量表部分.而局部变量表其实就保存着各种基本数据变量(int short long double float boolean byte char)以及对象引用.我们需要注意,如果执行方法请求栈的深度超过虚拟机所允许的深度,那么就会抛出*Error异常;同样虚拟机可>以动态扩展,如果扩展无法申请到足够的内存时就会抛出OutOfMemoryError异常.
        3,本地方法栈
                本地方法栈和java虚拟机栈的作用非常类似,只不过java虚拟机栈保存着java的执行方法,而本地方法栈保存着Native方法.注意:本地方法栈和java>虚拟机栈一样,也会抛出*Error异常和OutOfMemoryError异常
        4,java堆
                java堆是内存共享的区域,一般也是分配内存最大的区域,原因是该存储区域存储的是对象和数组数据.因此java堆也是垃圾收集区的主要区域,所以>在很多时候也被叫做"GC堆".java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可.如果java堆中不能为对象或数组完成内存的分配了,那么就会产生OutOfMemeryError异常.
        5,方法区
                方法区同样是内存共享的区域,它主要用来存储被加载的类信息 常量信息 静态变量 及时编译器编译后的代码等数据.它也被叫做"非堆".也是GC的>主要区域.同样会产生OutOfMemeryError异常.我们还要介绍一下方法区中的运行时常量池:
                        常量池主要是为了存储编译期间产生的各种字面变量和符号引用,这部分内容常在类加载后进入方法区的运行时常量池中存放.

~