java虚拟机的几个重要工作区域

时间:2022-12-27 13:05:53
  1、程序计数器
  程序计数器是java程序运行的行号标识器,字节码解释器通过改变程序计数器的值来选取下一条要执行的指令!分支、循环、跳转、异常、线程恢复等基础功能都需要依靠程序计数器来完成!java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的,在任何时刻一个处理器只能执行一条线程中的指令,因此为了线程切换之后能够恢复到正常的执行位置,每条线程都需要一个独立的程序计数器,多线程之间的计数器相互不影响,独立存储。
---------------------------------------------------------------------------------------------------------------------------------
  2、java虚拟机栈
  虚拟机栈是java方法执行的内存模型,方法被执行的时候创建一个栈帧,用来存储局部变量表、操作栈、动态链表、方法出口信息等。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从从入栈到出栈的过程。
  虚拟机栈存放的有八大基本数据类型,对象的引用(所有能够new的对象的地址,真是的对象存放到堆中了),所以他可以是指向对象初始地址的一个引用,也可能指向代表对象的句柄或者其他与此对象相关的位置。
八大基本数据类型中Long和double类型的数据要占用2个局部变量空间,其他的占用1个。局部变量所需的存储空间实在编译期间完成分配的,并且在方法运行期间程序不会改变局部变量的大小。这里要提的是在一定情况下循环是采用循环好那、还是使用迭代好呢!显然还是采用循环比较好,因为方法的调用存在出栈和入栈。而循环则不会出现这种情况。
在java虚拟机鬼法中,对这个区域规定了两种异常情况:如果线程请求的栈的栈深度,大于虚拟机所允许的深度,将抛出*Error异常,如果虚拟机栈可以动态扩展(当前大部分的java虚拟机都可以动态扩展,只不过java虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存是就会抛出OutofMemoryError异常。
---------------------------------------------------------------------------------------------------------------------------------
  3、本地方法栈
  本地方法栈和虚拟机栈的区别是:本地方法栈是为虚拟机执行本地方法而服务的,虚拟机栈是为虚拟机执行Java方法而服务的。
---------------------------------------------------------------------------------------------------------------------------------
  4、Java堆
  堆是Java内存结构中占用存储空间最大的一个,他是在虚拟机启动的时候创建的,他存在的唯一的目的就是存放对象实例,通俗的来说我们通过new方法创建的每一个实例,都会在堆内存中给它开辟一定的空间。Java的堆是垃圾回收器管理的主要区域,如果细分的话它还可以细分为新生代和老年代。这样划分也是更好的管理垃圾回收。但是需要注意的是Java堆可以是物理上不连续的内存空间,只要他们逻辑上连续就可以了。在实现上它可以实现固定大小的,也可以是可扩展的。
---------------------------------------------------------------------------------------------------------------------------------
  5、方法区
   方法区主要用于存储被虚拟机存储的类信息,常量,静态变量,即使编译器编译后的代码等数据。Java虚拟机对方法区的限制比较松散。主要体现在:(1)不需要连续的内存,可以选择固定大小的内存或者可扩展,(2)可以不是先垃圾回收器
---------------------------------------------------------------------------------------------------------------------------------
   6、运行时常量池
   他是方法区的一部分,主要用于存放编译器声场的各种字面量和符号引用。这部分内容将在类加载后存放到方法区的运行时的常量池中。