Java内存区域和内存溢出异常之一

来源:互联网 发布:阿里云备案承诺书下载 编辑:程序博客网 时间:2024/06/05 09:04
虚拟机运行时数据区域划分
程序计数器:这一部分是线程隔离的。可以看成是当前线程所执行的字节码的行号指示器。
字节码解释器的工作原理是改变计数器的值来选取下一条将要执行的指令。
如果执行的是Java方法,那么计数器记录的是虚拟机字节码指令的地址
如果执行的方法是本地方法,则计数器的值为空。

虚拟机栈:也是线程私有的,生命周期和线程一样。描述的是方法执行的内存模型。
在执行的时候回创建一个栈帧用来存储一些局部变量表等信息。
每一个方法从调用到结束都伴随着栈帧的入栈到出栈的过程。
本地方法栈:有的虚拟机中没有这个内存区域,执行native方法
我们常用的是Hotspot虚拟机中把本地方法栈和虚拟机栈结合在一起。
堆: 唯一的目的就是用来存放对象的实例。几乎所有的对象实例都是在这里分配内存。
根据Java虚拟机规范的规定,Java堆可以处于不连续的空间,但是从逻辑上是连续的就可以。
方法区:和堆一样,是线程共有的部分,用来存储类的信息,常量,静态变量等信息。
即是编译后的代码数据。方法区在Java逻辑规范上也被称为堆的一部分。
当然很多人也把方法区称为”永久代“ 只是因为Hotspot使用永久代来实现方法区
这样的话Hotspot的垃圾收集器可以像管理其他堆一样来管理方法区。可以省去一
些工作
运行时常量池, 这个也是方法区的一部分,用来存放编译器的字面量和符号引用。也有直接引用,在
编译的时候就转成了符号引用,这些东西会在类加载后进入方法区的运行时常量池释放,
Java没有要求常量一定一定要在编译器产生,所以运行期间也加入新的常量放到常量池中,
用的最多的就是String类的intern方法,这个有兴趣的可以查看一下源码。






















原创粉丝点击