java内存区域

来源:互联网 发布:网络贷款受法律保护吗 编辑:程序博客网 时间:2024/05/23 19:19

java虚拟机在执行java程序的过程中会把它的内存划分为多个数据区域,分别是

(1) 方法去和堆: 这两块区域是线程之间共享的,随着虚拟机进程的启动而存在

(2) 栈( 虚拟机栈和本地方法栈)和程序计数器: 这3块区域是线程的私有区域,随着线程的启动和结束而建立和销毁


1 方法区:用于存储虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码。例如类加载器加载类的时候,会读取class文件,以二进制流的方式,会对该类进行解析,提取类信息、静态变量和常量等存储再方法区,方法区无法满足内存分配需求时,会抛出OOM

2. java堆:

3. 虚拟机栈:生命周期与线程相同,用于存储局部变量,操作数,动态链接和方法出口等信息,每个方法被调用直到执行完成,就对应着一个栈帧的入栈和出栈。

栈是以栈帧的形成保存再栈中的,每调用一个方法,就会压入一个栈帧,栈帧包括3个部分:局部变量区、操作数区和帧数据区。每个栈帧的局部变量区和操作数区的大小是从方法区读取类的信息获取的。

    局部变量区: 方法的参数,局部变量等。

    操作数区: 栈的形式存储,为了计算开辟的数据区域,编译原理中有相关的算法。

    帧数据区:常量的解析,方法的返回和异常派送等

    当线程请求的栈深度大于虚拟机所允许的最大深度时,将抛出StackOverflowError异常,比如死循环,无线递归之类的。

    当栈的空间扩展时,无法申请到足够的内存时会抛出OOM异常。

4. 本地方法栈:类似于虚拟机栈,区别就是本地方法栈访问的是Native方法,而不是java方法,同样也会抛出StackOverflowError和OOM异常

5. PC: 程序计数器,和cpu中的PC寄存器差不多,唯一一块不会抛出OOM的区域,记录下一条要执行的指令的地址。

  

0 0
原创粉丝点击