转载

JAVA虚拟机JVM工作原理

提起JAVA,都知道它有个虚拟机,因此可以跨平台,一次编写,到处运行。但具体原理是咋样的?身为JAVA小白,岂可不知!

一、原理

JVM实现了JAVA语言最重要的特征:平台无关性。其原理:java程序并不直接在操作系统上执行,而是由JVM执行。JVM屏蔽了与具体平台相关的信息,使得JAVA程序只需编译成适应JVM,可以在JVM上运行的目标代码(.class)就行,JVM再负责解释成具体平台的机器指令执行。同时,JVM还会进行安全检查,是java程序的安全检验引擎。

二、结构

JVM由三大部分组成:

1、类加载器
2、执行引擎
3、运行时数据区域

JAVA虚拟机JVM工作原理

1、类加载器

具体作用就是将 .class 文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的 .class 文件,而是根据需要去动态加载。

类的加载过程采用双亲委派模型:

1)当前类加载器首先检查自己的加载清单,如果存在该类,则返回之;

2)如果没找到,委托父类加载器去加载;父类加载器重复动作1,递归至祖宗bootstrap ClassLoder(我靠,bootstrap,还以为是前端框架呢。bootstrap,引导之意);

3)都没有,仍然由当前类加载器加载,并纳入自己缓存中。

采用双亲委派模型,目的在于更好的保证Java平台的安全。所谓的安全,是指java的核心类被用户自己编写的类所替换。由于核心类在虚拟机初始化时就已加载,而每次加载类前先检查是否存在,所以可以避免核心类被替换。

各种类加载器:

JAVA虚拟机JVM工作原理

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虚拟机栈,本地方法栈存储线程的信息

原文  https://blog.csdn.net/leftfist/article/details/85131366
正文到此结束
Loading...