内存区域

来源:互联网 发布:华为杯网络比赛 编辑:程序博客网 时间:2024/05/16 12:57
1.运行时数据区域







1.程序计数器(线程隔离数据区)唯一一个不出现OOM的数据区
是一块较小的内存空间,可看作当前线程所执行的字节码的行号指示器
通过改变指示器的值来进入吓一条字节码指令。如果在执行native方法,值为0
java虚拟机的多线程是通过线程轮流切换并分配处理执行时间的方式来实现的,在任何时刻,一个 cpu都会执行程序的指令,因此每个线程都需要有自己的PC

2.虚拟机栈(线程私有区域)
生命周期与线程相同,虚拟机栈描述的是java方法执行的内存模型。
每个方法执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口),
方法执行对应着栈帧的入栈道出栈。
局部 变量表
存放了 各种基本数据类型,引用类型,returnAddress类型。long 和double需要两个局部变量
空间
Object obj=new Object();//obj 存放在栈中,new Object() 存放在堆
int i=88;//存放在栈

3.java堆

最大的一块,虚拟机启动时创建,存放对象实例,对象实例以及数组。垃圾收集主要区域,GC堆。
由于收集器都采用分代收集,所以堆分为:新生代和老年代。在细致的分:Eden,From Survivor,
To Survivor空间等。划分目的是为了更好的回收,或者分配内存。

在实现时可固定大小,也可是扩展的。
当前主流的都是可扩展的。(通过 -Xmx和-Xms来控制)。
如果没内存了,并且无法扩展时抛出OOM

4.方法区(共享内存)
存放已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等。堆的逻辑部分。
此区域主要收集的垃圾为常量池的回收以及类型的卸载。会抛OOM


5.运行时常量池
方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外还有常量池。
常量池:用于存放编译期生存的字面量和符号引用,这些在类加载后进入方法区的运行时常量池中
存放。并不是非要一定是编译期的放入常量池,比如String.intern();


........
0 0
原创粉丝点击