Java内存区域分析
Posted Brenda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内存区域分析相关的知识,希望对你有一定的参考价值。
程序计数器
- 指令运行的指示器.
- 每一个线程都有独立的程序计数器,互无影响,我们称这类区域为线程私有的内存.
- 运行Java方法,计数器记录的是正在运行的虚拟机字节码指令地址;假设运行的是native方法,这个计数器为空.
- 此内存区域唯一一个没有规定不论什么OutOfMemoryError的区域.
虚拟机栈
- Java虚拟机栈也是线程私有的,它的生命周期与线程同样.
- 虚拟机栈描写叙述的是Java方法运行的内存模型:每一个方法在运行的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息.
- 假设线程请求的深度大于虚拟机深度,将抛出StackOverflowError异常;假设虚拟机能够动态扩展,扩展时无法申请到足够的内存,将抛出OutOfMemoryError.
本地方法栈
和虚拟机栈很类似,他们之间的差别是本地方法栈是为虚拟机使用的native方法服务的,而虚拟机栈是为虚拟机运行Java方法服务的.
Java堆
- Java堆是虚拟机管理的最大的一块内存.
- 被全部线程共享的一块区域.
- 此内存唯一目的是存放对象的实例.
- 垃圾收集管理主要区域.
方法区
方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机载入的类信息,常量,静态变量,即时编译器编译后的代码等数据.
运行时常量池
- 运行是常量池是方法区的一部分.
- 用于存放编译期生成的各种字面量和符号引用.
- 运行时常量池和Class文件常量池不一样.Java语言不要求编译时产生Class文件常量才干进入运行时常量池,运行期间也可能将新的常量放入池中.这样的特性被开发者用的多便是String类的intern()方法.
以上是关于Java内存区域分析的主要内容,如果未能解决你的问题,请参考以下文章
46栈内存溢出内存区域(程序计数器Java 虚拟机栈本地方法栈Java 堆方法区直接内存内存溢出)与内存溢出(对象实例化分析)