Java运行时数据区域(堆 栈 方法区 常量池)
Posted dddjp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java运行时数据区域(堆 栈 方法区 常量池)相关的知识,希望对你有一定的参考价值。
运行时数据区域
(1)程序计数器(program counter register)
一块较小的内存空间
当前线程所执行的字节码的行号指示器,字节码解释器在工作的时候就是通过改变程序计数器的值来选取下一跳要执行的指令
多线程环境下,线程轮流切换执行,程序计数器保证线程切换之后能恢复到正确的位置
每个线程都有一个独立的程序计数器
线程私有
没有任何异常
(2)虚拟机栈(stack)
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的过程中都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
局部变量表中存放了编译期间可知的各种数据类型:boolean byte char short int float long double 对象引用(long和double占用两个局部变量空间slot)
局部变量表的大小在编译期间确定
线程私有
StackOverflowError:线程请求栈的深度大于虚拟机允许的栈的深度
OutOfMemoryError:Java虚拟机栈动态扩展时无法申请到足够的内存
(3)本地方法栈
虚拟机栈为虚拟机执行Java方法服务
本地方法栈为虚拟机执行Native方法服务
(4)堆
线程共享
存放所有的实例对象和数组
Java内存区域最大的一块
垃圾回收的主要区域(GC堆)(garbage collected)
堆内存可以是物理上不连续的存储空间、逻辑上连续即可
OutOfMemoryError:堆内存扩展时无法获取到足够的内存
(5)方法区
线程共享
存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译之后的代码
OutOfMemoryError:方法区无法满足内存分配的需求时
(6)运行时常量池
方法区的一部分
class文件中除了有类的版本、字段、方法、接口等的描述外,还有一项是常量池(constant pool table),用于存放编译期间生成的各种字面量和符号引用
在类加载之后存放
除了保存Class文件中描述的符号引用之外,还会把翻译出来的直接引用也存储在常量池中
OutOfMemoryError
以上是关于Java运行时数据区域(堆 栈 方法区 常量池)的主要内容,如果未能解决你的问题,请参考以下文章
12.JDK1.8 JVM运行时数据区域概览各区域介绍程序计数器Java虚拟机栈本地方法栈堆堆空间内存分配(默认情况下)字符串常量池元数据区jvm参数配置