Java虚拟机运行时数据区域结构
Java虚拟机运行时数据区域分为两部分,一部分是私有区一部分是共享数据区。
线程私有区:私有区是每一个线程都会拥有的区域,其中私有区内包括程序计数器和栈(hotspotVM中将本地方法栈也就是native方法栈以及虚拟机栈统称为栈)。
1.程序计数器:是用于记录执行下一行代码的指示器,在native方法中程序计数器为null(因为虚拟机内的程序计数器主要用于Java字节码文件执行位置记录,所以当调用native方法时与Java字节码没什么关系,所以native方法中程序计数器为:undefined) ,程序技术器的占用空间非常的小同时是Java虚拟机内唯一不会存在溢出(OutOfMemoryError)的区域。
2.虚拟机栈:通常说的栈就是这一块区域,虚拟机栈描述的是Java中方法在执行时候的内存模型,每一个方法执行是都会创建一个栈帧进行信息的存放,栈帧中主要包含了局部变量表、操作栈、方法返回地址、动态链接、额外的附加信息等内容,Java虚拟机规范中定义了两种情况(OutOfMemory和StackOverFlow)异常,当请求或扩展超出了栈中规定大小就会可能抛出两种中的异常,要注意虚拟机栈中是不会存在内存碎片的。
3.本地方法栈:本地方法栈与虚拟机栈的功能大致相同,只不过虚拟机栈是作用于Java字节码文件而本地方法栈是用于native方法,同样的本地方法栈也规定了两种情况(OutOfMemory和StackOverFlow)异常,当请求或扩展超出了栈中规定大小就会可能抛出两种中的异常。
共享数据区:数据共享区是进程公用的一块内存区域,所有线程都可以使用该区域,其中共享数据区包括了Java堆和方法区。
1.Java堆区:就是指Java堆区虚拟机能够管理的最大的一块内存区域,同时也是在做内存优化时主要的战场, 虚拟机能管理的最大的一块内存 GC的主战场,Java堆区中存放着对象实列、数组中的内容,存放内容的物理上的内存空间可能不是连续的,同时Java虚拟机规范中也定义了,当申请内存而超出了最大分配内存时就会抛出OOM(OutOfMemoryError)。
2.方法区:方法区中包含了ClassLoader加载的类信息、常量、静态变量、以及编译后的代码等,在方法区中还有一部分区域叫做运行时常量沲,运行时常量沲是方法区域的一部分,常量池中包括了字面量、public static final形式的java常量、符号引用 类,接口全名,方法名等信息。方法区同样的Java虚拟机规范中也定义了,当申请内存而超出了最大分配内存时就会抛出OOM(OutOfMemoryError),运行时常量池作为方法区的一部分自然也会有同样的规定。
Java虚拟机运行时数据区域结构下一篇 简单了解下GC如何确定内存回收,以及Android中回收机制可达性分析算法。
网友评论