虚拟机(1)

  程序计数器是一块较小的内存空间,它可以看是当前进程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值取下一条需要执行的字节码指令,分支,跳转,异常处理,线程恢复等基础功能要依僰这个计算器来完成。
由于JAVA虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现在任何一个确定的时刻,一个处理器(一个内核)都只会执行一个程序中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个程序计算器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线有”的内存。
  如果线程正在执行的是一个JAVA方法,这个计算器记录的是正在执行的虚拟机字节令的地址:如果正的执行的是Native方法,这个计算器则为空(undefind).此内存是唯 一个在JAVA中没有outOfmembered情况的区域。
  与程序计数器一样,JAVA虚拟机粘也是线程私有的。它的生命第一期与线程相同。虚拟机栈描述的是JAVA方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用来存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到完成,对着着一个栈帧在虚拟机中入栈到出栈的过程。
  本地虚拟机栈与虚拟机栈发挥的作用类似,它们之间的区别不过是虚拟机栈为虚拟机执行JAVA方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的NATIVE方法服务。
对于大多数应用来说,JAVA堆是虚拟机管理内存中最大的一块。JAVA堆是被所有内存共享的一块内存区域。在虚拟机启动时创建,唯一目的是存放对象实例,几乎所有的对象实例都在这里分配内存。
  方法区与JAVA堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译的代码等数据。虽然JAVA虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做非堆,目的是与JAVA堆区分开来。
  运行时常量池是方法区的一部分,class文件中除了有类的版本,字段,方法,接口等描述信息还,还有一项信息是常量池。
  直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机定义的内存区,但是这部分的内存被频繁的使用

猜你喜欢

转载自loki328.iteye.com/blog/2308140