深入浅出JVM:运行时数据区域
Posted psxjoy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出JVM:运行时数据区域相关的知识,希望对你有一定的参考价值。
程序计数器
- 线程私有
- 指向了正在执行的虚拟机字节码指令的地址;如果是本地方法,数值为空
- 没有 OutOfMemoryError 错误的区域
Java虚拟机栈
- 线程私有;
- 生命周期与线程相同;
- 代表着 Java 方法执行的内存模型:每个方法执行时的同时会创建一个栈帧(Stack Frame)用于存放局部比量表、操作数栈、动态链接、方法出口等信息。
- 每个方法从调用到执行完毕的过程,对应着每一个栈帧在虚拟机栈中入栈到出栈的过程。
- 如果线程请求的栈深度大于虚拟机允许的深度,跑出 StackOverflowError 异常;无法申请到足够的内存,抛出 OutOfMemoryError 错误。
本地方法栈
- 线程私有;
- 和 Java 虚拟机栈类似,但是是为 Native 方法服务。
Java 堆
- 线程共享;
- Java 虚拟机中内存最大的一块;
- 惟一的作用是存放对象实例:所有的对象实例以及数组都要在堆上分配;
- 是垃圾收集器的主要区域。详细区分的话,可以分为新生代和老年代,再细致的话,可以分为 Eden 空间、 From Surivor 空间、 To Surivor 空间;
- Java 堆可以处于物理上不连续的内存空间中,只要逻辑是连续的即可。 主流的虚拟机通过 -Xms 和-Xmx控制;
- 如果堆中没有内存完成实例分配,并且堆无法再拓展时,抛出 OutOfMemoryError 错误。
方法区
- 线程共享;
- 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
- 已被称为 Non-Heap;
- 有时候被称为永久带,原因:HotSpot 虚拟机将GC分带收集拓展至方法区;
方法区内存无法满足内存分配需求时,抛出 OutOfMemoryError 错误。
####运行时常量池- 方法区的一部分;
- 存放编译期产生的各种字面量和符号引用;
- OOM 报错和方法区一致。
以上是关于深入浅出JVM:运行时数据区域的主要内容,如果未能解决你的问题,请参考以下文章