提起JAVA,都知道它有个虚拟机,因此可以跨平台,一次编写,到处运行。但具体原理是咋样的?身为JAVA小白,岂可不知!
一、原理
JVM实现了JAVA语言最重要的特征:平台无关性。其原理:java程序并不直接在操作系统上执行,而是由JVM执行。JVM屏蔽了与具体平台相关的信息,使得JAVA程序只需编译成适应JVM,可以在JVM上运行的目标代码(.class)就行,JVM再负责解释成具体平台的机器指令执行。同时,JVM还会进行安全检查,是java程序的安全检验引擎。
二、结构
JVM由三大部分组成:
1、类加载器 2、执行引擎 3、运行时数据区域
1、类加载器
具体作用就是将 .class
文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的 .class
文件,而是根据需要去动态加载。
类的加载过程采用双亲委派模型:
1)当前类加载器首先检查自己的加载清单,如果存在该类,则返回之; 2)如果没找到,委托父类加载器去加载;父类加载器重复动作1,递归至祖宗bootstrap ClassLoder(我靠,bootstrap,还以为是前端框架呢。bootstrap,引导之意); 3)都没有,仍然由当前类加载器加载,并纳入自己缓存中。
采用双亲委派模型,目的在于更好的保证Java平台的安全。所谓的安全,是指java的核心类被用户自己编写的类所替换。由于核心类在虚拟机初始化时就已加载,而每次加载类前先检查是否存在,所以可以避免核心类被替换。
各种类加载器:
Bootstrap class loader: 父类
当运行 java 虚拟机时,这个类加载器被创建,它负责加载虚拟机的核心类库,如 java.lang.* 等。例如 java.lang.Object 就是由根类加载器加载的。需要注意的是,这个类加载器不是用 java 语言写的,而是用 C/C++ 写的。
Extension class loader:
这个加载器加载出了基本 API 之外的一些拓展类。
AppClass Loader(SystemAppClass):
加载应用程序和程序员自定义的类。
2、执行引擎
作用: 执行java编译好的字节码,或者执行本地方法
3、运行时数据区域
JVM 运行时数据区域 (JVM Runtime Area) 其实就是指 JVM 在运行期间,其对JVM内存空间的划分和分配。JVM在运行时将数据划分为6个区域来存储:
Program Counter (PC) Register:程序计数器 Java Virtual Machine Stacks:Java虚拟机栈 Heap Memory:堆内存 Method Area:方法区 Run-time Constant Pool:运行时常量池 Native Method Stacks:本地方法栈
我们写的所有程序都被加载到这里,按不同类别存放在
堆内存 Java虚拟机栈 本地方法栈 程序计数器 方法区
1)从 线程的角度 理解Java Runtime Area
a.线程私有:
程序计数器 Java虚拟机栈 本地方法栈,生命周期与线程一致;
b.线程共享:
Java堆,方法区,运行时常量池,生命周期与JVM一致。
2)从 存储内容 理解Java Runtime Area
方法区和常量池存储类的信息
堆内存存储对象信息
程序计数器,Java虚拟机栈,本地方法栈存储线程的信息