java高分局之运行时数据区

java虚拟机定义了几种不同的运行时数据区。有些数据局在虚拟机启动的时候创建,在虚拟机退出的时候销毁,另外一些是每个线程的数据区,当线程创建的时候创建,当线程撤销的时候销毁。

PC寄存器

java虚拟机可以支持多个线程同时执行,每个虚拟机线程都有自己的pc寄存器(也叫程序计数器)。在某一个时刻,每个虚拟机线程都会执行单个方法的代码,这个方法我们叫他线程的当前方法。如果这个方法不是本地方法,pc寄存器会记录当前正在执行的指令的地址。如果当前方法是一个本地方法,java虚拟机的pc寄存器的值是undefined。

虚拟机栈

每一个java虚拟机线程都有一个私有的虚拟机栈,当线程创建的时候就会创建这个栈,栈是用来存储栈帧的,每一个方法就对应一个栈帧。java虚拟机栈和传统语言C很相似:存储局部变量和部分结果,并在方法调用和返回时起到重要作用。栈的内存可以是不连续的。
我们可以通过-Xss参数来设置虚拟机栈的大小,默认栈的大小是512K,一般情况128K就够用,我们可以根据自己的需要设置栈的大小。
—-如果一个线程需要的栈的大小大于允许使用的大小虚拟机就会抛出StackOverflowError.
—-如果虚拟机栈的大小允许自动扩展,当扩展时没有足够的内存空间或者没有足够的空间容纳一个线程启动时所占的栈大小就会抛出StackOverflowError

java虚拟机堆是所有线程的共享区域,在这里存储着所有类的实例和数组。堆是在虚拟机启动的时候创建,然后通过垃圾回收器来管理;如果需要的堆空间大于可用的大小那么会抛出OutOfMemoryError.

方法区

方法区是所有线程的共享区域。方法区就像传统语言编译后代码的的存放区域或者操作系统进程中的文本片段。方法区中存放每个类的结构,比如运行时常量池、域和方法数据。
当虚拟机启动的时候就会创建方法区,尽管方法区是堆的一个逻辑部分。但是方法区的实现可以不进行垃圾回收,虚拟机规范并没有强制规定方法区的实现方式。如果方可用的内存不足以容纳方法区数据就会抛出OutOfMemoryError.

运行时常量池

运行时常量池是类和接口的class文件中constant_pool属性的表现。包含了不同种类的常量,从字面值到方法和域的引用。每个常量池都在方法区中分配,每个类和接口的常量池在他们被虚拟机创建的时候创建,通常常量池也会抛出OutOfMemoryError.

本地方法栈

和虚拟机栈类似,只不过执行的是本地方法。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐