JVM学习笔记(一)
注:这个系列的文章主要是《深入JAVA虚拟机》这本书的读书笔记,内容主要来源于该书
1、Java虚拟机可能指的是如下三种不同的东西:
- 抽象规范
- 一个具体的实现
- 一个运行中的虚拟机实例
2、Java虚拟机的生命周期
一个运行时的Java虚拟机实例的天职就是:负责运行一个Java程序(或者说Java进程)。当启动一个JAVA程序时,一个虚拟机实例也就诞生了。当改程序关闭退出时,虚拟机实例也就随之消亡。如果在同一台设备上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于自己的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行Java程序。这个main()方法必须是public、static、void的,并且接受一个字符串数组作为参数。
3、Java虚拟机的体系结构
Java虚拟机的结构框图如下:

每个Java虚拟机都有一个类装载器子系统,它根据给定的全限定名来装载类和接口,同样,每个Java虚拟机都有一个执行引擎,它负责执行那些包含在装载类的方法中的指令。当Java虚拟机运行一个程序时,它需要内存来存储很多东西,例如,字节码,从class文件中得到的类信息,程序创建的对象,传递给方法的参数,返回值,局部变量以及中间运算结果等,Java虚拟机把这些东西都组织到运行时数据区,便于管理。
运行时数据区中的方法区和堆是各个进程共享的,而每一个线程创建时,它都将得到属于自己的程序计数器以及一个Java栈:如果线程正在执行一个Java方法(非本地方法)那么PC寄存器中的值将总是指示下一条将被执行的指令,而它的Java栈则总是存储该线程中Java方法调用的状态--包括它的局部变量,被调用时传进来的参数,它的返回值,以及运算的中间结果等等。而本地方法调用的状态,则是以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其他某些与特定实现相关的内存区中。
Java栈是由很多栈帧或者说帧组成的。一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中:当该方法返回时,这个栈帧被从Java栈中弹出并抛弃。Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。这样设计的原因是为了保持Java虚拟机的指令集尽量紧凑,同时也便于Java虚拟机在那些只有很少通用寄存器的平台上实现。另外,Java虚拟机的这种基于栈的体系结构,也有助于运行时某些虚拟机实现的动态编译和即时编译器的代码优化。
3.1、数据类型
Java数据类型可以分为两种:基本类型和引用类型。基本类型的变量持有原始值,而引用类型的变量持有引用值--即对象的引用,而不是对象本身,与此相对,原始值则是真正的原始数据。Java中的基本数据类型包括float,double,byte,short,int,long,char,boolean,这些基本类型的值域(位数)在任何地方都是一样的,比如int型数据在哪里都是32位的。

浙公网安备 33010602011771号