《深入学习java虚拟机》--笔记2

来源:互联网 发布:手机账本软件 编辑:程序博客网 时间:2024/05/16 08:53
 现在谈谈对堆的理解:

      Java程序在运行时的所有类实例或数组都放在同一个堆中。而一个JAVA虚拟机实例中只存在一个堆空间,因此所有线程都共享这个堆。又由于一个Java程序独占一个Java虚拟机实例,因而每个Java程序都有自己的对空间--它们不会相互干扰。

   Java虚拟机又一条在堆中分配对像的指令,却没有释放内存的指令。那么虚拟机如何以及何时示范不再运行的程序引用的对象所占据的内存呢?这里就要提到的是--垃圾收集器,所以程序本身不考虑内存回收问题。
   垃圾收集器  主要工作就是自动回收不再被运行的程序引用的对象所占用的内存,此外,它也肯能区移动那些还在使用的对象,以此减少堆碎片。
  
    只要有一个对象引用,虚拟机就必须能够快速的定位对象实例的数据,另外,它也必须能够通过该对象引用相应的类数据(存储于方法区的类型信息)。因此在对象中通常会有一个指向方法区的指针。
   一种可能的堆空间设计就是把堆分两部分:一个句柄池,一个对象池
   句柄池:有两个指针,一个指向对象实例变量的指针,一个指向方法区类数据的指针
如图所示(画的有点糟..)
《深入学习java虚拟机》--笔记2


数组的内部表示
   在JAVA中,数组时真正的对象。和其它对象一样,数组总是存放的堆中。以下举例以助于理解:
  例: int[][] ar = new int[2][2];  如图所示:
《深入学习java虚拟机》--笔记2

     程序计数器  对于Java程序,每个进程都有它自己的PC(程序计数器)寄存器,它时该线程启动时创建的。
     PC的大小是一个字长,所以它能持有一个本地指令,也可以持有一个returnAddress;当执行某java方法时,
     PC寄存器的内中总是执行着下一条指令的“地址”,这里的地址也时以条本地的指针。
  
      JAVA栈  每当启动一个新线程后,Java虚拟机就会为它分配一个Java栈。(执行出栈和入栈操作)
   每当调用一个java方法时,虚拟机都会在该线程的java栈中压入一个新帧,当然这个帧就时当前帧,当在执行这个方法时,它会使用这个帧来存储参数、局部变量、中间结果等数据。  
      
     Java的方法通常有两种方式返回,一种时return返回,这称为正常返回;还有一种就是抛出异常而异常中止。不管使用哪种方式,虚拟机都将当前帧弹出java栈而释放掉,这样让上一个方法就成了当前帧。
原创粉丝点击