Java内存区域划分

来源:互联网 发布:php后端管理模板 编辑:程序博客网 时间:2024/04/30 13:00
jvm内存区域划分为这几个部分:程序计数器,Java栈,本地方法栈,方法区,堆。
每部分存储的数据如下:
1.程序计数器(指示执行指令)
保存程序当前执行的指令的地址,当CPU需要执行指令时,从程序计数器中得到当前需要执行的指令所在的存储单元的地址,然后根据得到的地址获取到指令。
每个线程都有自己独立的程序计数器。
由于程序计数器中存储的数据所占空间的大小不会碎程序的执行发生改变,因此,对于程序计数器是不会发生内存泄漏现象(OutOfMemory)

2.Java栈
Java栈是Java方法执行的内存模型,里面存放的是一个个栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量,操作数栈,指向当前方法所属的类的运行时常量池的引用,方法返回地址,和一些额外的附加信息
当线程执行一个方法的时候,就会创建一个栈帧,并将创建的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。
栈帧内存储元素介绍:
局部变量:存储方法中的局部变量,基本数据类型直接存储值,引用类型变量存储指向对象的引用
操作数栈:
指向运行时常量池的引用:在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用 指向运行时常量

3.本地方法栈
与Java栈相似,区分在于Java栈是为执行Java方法服务,而本地方法栈则是为执行本地方法服务的。

4.堆
Java中的堆是用来存储对象本身,堆是所有线程共享的,在JVM中只有一个堆

5.方法区
方法区也是被线程共享的区域,里面主要存储了每个类的信息,包括类的名称,方法信息,字段信息,静态变量,常量以及编译器编译后的代码等
在方法区中还包括运行时常量池,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。




0 0