你不得不知道的JVM(上)

2021-09-16  本文已影响0人  小驴小驴

一、JVM 与 JDK之间的联系

JDK是一个大集合,囊括了JRE、JDK工具(javac、javap...),同样包括了最为重要的JVM

二、JDK自带工具

2.1 Javap 工具

Javap工具可以将无法识别(除非借助查看JVM Class字节码文件的协议信息才能读懂),因此通过Javap反编译工具将字节码文件重新反编译成能读懂的文件

2.2 JStack

检测线程情况,判断是否存在死锁

2.3 JConsole

图形化界面查看JVM 运行时数据区的使用情况,垃圾回收的次数与时间

2.4 JVisualvm

同JConsole,功能更加强大

三、JVM为何能够跨平台

比如 Groovy、Java、Scala、kotlin都能依托JVM运行,是因为这些语言会将源代码编译成符合JVM约束的Class文件

四、Java类加载流程

Java的类加载依赖于ClassLoader,ClassLoader会将Class字节码文件加载到内存中,并负责进行下面的加载、链接、初始化过程

五、Class.forName 与 ClassLoader的区别

5.1 Class.forName

Class.forName有两种参数形式方法:

在第二个方法中,initialize参数就是控制加载的时候是否进行初始化,默认为True.

5.2 ClassLoader.loadClass

方法签名:

该方式无法进行 初始化 操作。

5.3 比较

两者都可以保证类加载中的 加载链接

但Class.forName默认可以进行初始化操作,而ClassLoader方式不会

六、ClassLoader类加载器

6.1 分类

6.2 加载流程:双亲委派机制

这是类加载机制中需要遵守的规则

6.2.1 双亲委派机制的意义

七、JVM组成部分(简述)

这部分主要由两部分组成,分别是 运行时数据区执行引擎两部分组成,下面将进行阐述

7.1 运行时数据区

在上述部分中详细介绍了class字节码加载到JVM的过程,那么如何组织这些Class文件中不同的结构以及Class中的指令该如何运行,这些就是运行时数据区应该考虑的事情,而方法区中的所有区域生命周期也不同,有的区域生命周期同JVM生命周期,有的区域的生命周期同应用程序中的线程生命周期

运行时数据区的组成部:

7.1.1 方法区

7.1.2 堆

7.1.3 栈

7.1.4 程序计数器

线程安全,记录当前线程正在执行的指令地址,用于假设当前线程失去了CPU执行权,当重新获取CPU执行权时,能够恢复之前的线程继续完成任务

7.1.5 本地方法栈

线程安全,结构同栈,只是本地方法栈执行的是标注有native关键字的方法,而这些方法是由C、C++编写的。

7.2 执行引擎

在执行引擎中包括了三个部分,下面逐一介绍

7.2.1 即时编译器

当开启了开选项之后(默认开启),会动态侦听热点代码,当发现有热点代码之后,通过即时编译器可以将某一段热点代码编译+解释形成CPU可直接执行的机器码指令,并保存在方法区,之后直接可以运行,从而提高热点代码的执行效率

7.2.2 垃圾回收器

这也是Java流行的原因之一,因为Java有垃圾回收器,从而不需要开发人员自己去释放垃圾

7.2.3 解释器

之前面试有个常考的面试题:Java是编译形语言还是解释形语言?其实Java是两者都有兼顾到

Java先利用Javac工具将Java代码编译成Class字节码文件,当类加载器将Class字节码文件加载到JVM之后,真正运行字节码指令时,还是需要解释器去将指令翻译成CPU可识别的指令。

上一篇下一篇

猜你喜欢

热点阅读