面试必问:JVM类加载机制详细解析

摘要:
前言在Java面试中,简历中有一些与JVM相关的内容。JVM的类加载机制基本上是面试必须询问的知识点。类加载的定时VM规范没有严格指定类加载的时间,这与特定的JVM虚拟机有关。在JVM中,类的唯一性只能由类本身和类加载来确定。每个类加载器都有一个独立的命名空间。总之,类加载器在JVM中的作用是将类的字节码文件从JVM外部加载到内存中,确定类的唯一性,提供隔离特性,并为中间件开发人员提供便利,例如Tomcat
前言
在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点。
面试必问:JVM类加载机制详细解析第1张
类的加载和卸载
JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是class文件。平常我们写的Java文件,需要编译为class文件才能交给JVM运行。可以这么说:C语言代码——>二进制文件——>计算机硬件,就相当于Java代码——>字节码文件——>JVM。JVM将指定的class文件读取到内存里,并运行该class文件里的Java程序的过程,就称之为类的加载;反之,将某个class文件的运行时数据从JVM中移除的过程,就称之为类的卸载
class文件的运行时数据就是C++对象,也称为kclass对象,这些运行时数据在JDK7之前是放在永久代(PermGen),JDK8之后则放在元空间(Metaspace)。
面试必问:JVM类加载机制详细解析第2张
类的生命周期
Java类从被虚拟机加载开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段;其中验证、准备和解析又统称为连接(Linking)阶段。
面试必问:JVM类加载机制详细解析第3张
类的加载的时机
虚拟机规范并未严格规定类加载的时机,跟具体的JVM虚拟机有关。类加载的最佳时机是解析Java字节码类文件中常量池符号的时候,Class.forName()、ClassLoader.loadClass()、反射API和JNI_FindClass都可以触发类加载,Hot JVM自身启动的时候也会触发类加载。
通过JVM参数中加 -verbose:class,可以在应用启动的时候打印类加载的过程,如下图所示:
面试必问:JVM类加载机制详细解析第4张
初始化这个阶段,JVM虚拟机给出了5种必须对类进行“初始化”的情况
  1. 使用new关键字实例化对象的时候、读取或设置一个类的静态字段的时候、调用一个类的静态方法的时候;
  2. 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则要先触发其初始化;
  3. 当初始化一个类的时候,如果发现其父类还没有被初始化,则要先初始化其父类;
  4. 当虚拟机启动时,用户需要指定一个执行的主类(包含main方法的那个类),则虚拟机会优先初始化这个主类;
  5. 在JDK1.7以后,动态语言支持的时候,如果一个java.lang.invoke.MethodHandle实例最后的结果是要执行第1种情况的操作,则也要进行初始化。
类的卸载时机
类的卸载跟采用的垃圾收集算法有关,在CMS中有两种方法卸载不必要的类,一种是等到元空间(Metaspace)满了的时候触发FGC,另一种是使用跟CMS并发收集算法类似的方式,不过对于元空间的阈值和触发CMS并发收集的阈值是独立的。更具体的可以参考之前的文章:CMS学习笔记。在这里,我们只需要记住,JVM中一个类的卸载要满足下面这3个条件:
  1. 该类所有的实例对象都已被回收;
  2. 该类的类加载器对象已经被回收;
  3. 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
面试必问:JVM类加载机制详细解析第5张
类加载器的作用
类的加载是需要类加载器完成的,但是类加载器在JVM中的作用可不止这些。在JVM中,一个类的唯一性是需要这个类本身和类加载一起才能确定的,每个类加载器都有一个独立的命名空间。
不同的类加载器,即使是同一个类字节码文件,最后再JVM里的类对象也不是同一个,下面的代码展示了这个结论:
上述代码的运行结果是:
面试必问:JVM类加载机制详细解析第6张
可以看出,代码中使用自定义类加载器(myLoader)加载的jvm.ClassLoaderTest类和通过应用程序类加载器加载的类不是同一个类。综上,类加载器在JVM中的作用有:
  1. 将类的字节码文件从JVM外部加载到内存中
  2. 确定一个类的唯一性
  3. 提供隔离特性,为中间件开发者提供便利,例如Tomcat
 

免责声明:文章转载自《面试必问:JVM类加载机制详细解析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue的main.jsjQuery表格插件:帮助Web设计者驾御HTML表格【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vmware ESXi安装群晖Synology DSM 5.x

简介 在Vmware ESXI中安装群晖Synology DSM 5.0 (4528) 文件准备 Vmware ESXi用户安装需要的文件 NB_x64_5032_DSM_50-4528_Xpenology_nl.rarDSM_DS3612xs_4528.pat (Synology DSM 5.0 (4528) 2014年10月30日 最新)Synolog...

解决VMware虚拟机网络时长中断的问题

1. 操作环境 VMware VMware® Workstation 14 Pro Windows Win7旗舰版 2. 操作过程   VMware虚拟机在使用一段时间后,经常会出现时常断网的情况,而且这种情况也非常的让人头疼,因为我们在使用虚拟机的时候绝大多数是有联网需求的,如果虚拟机不能联网,那么我们使用该虚拟机的目的又有何在?!   解决的办法是...

超简单,安卓模拟器手动root

本文转载自:http://quantoubao.blog.163.com/blog/static/2083211702013870501987/ 安装Android SDK安卓模拟器的方法很简单,网上大把,傻瓜式的。不过对其root的方法,网上的版本就不那么好使了。网上的方法从方向性来说是没错的,就是细节没给讲清楚,或者讲错,或者没提到这样root方式对高...

qemu kvm 虚拟化

虚拟化: KVM是一个基于Linux内核的虚拟机,属于完全虚拟化。虚拟机监控的实现模型有两类:监控模型(Hypervisor)和宿主机模型(Host-based)。由于监控模型需要进行处理器调度,还需要实现各种驱动程序,以支撑运行其上的虚拟机,因此实现难度上一般要大于宿主机模型。KVM的实现采用宿主机模型(Host-based),KVM是集成在Linux内...

虚拟机配置host访问主机web

环境介绍: 主机:ubuntu系统 虚拟机(virtualbox):xp系统 需求:要求在虚拟机中可以访问主机的web站点或者项目 操作步骤: 1.先查看虚拟机中的默认网关 2.在虚拟机中的host文件中添加主机中设置的虚拟域名即可 hosts文件所在路径:C:\WINDOWS\system32\drivers\etc 如下图:...

ESXi 虚拟机性能情况简单验证

1.虚拟化的CPU超售问题。 经过查找资料, 发现 ESXi 5.5 的版本 一个 物理CPU得Core 可以虚拟出 25个vCPU, 升级到ESXi6.0 之后可以虚拟化32个vCPU。 所以虚拟化的超售特别严重, 会降低性能。  理论上最极端的情况 只有普通CPU的 十分之一左右的性能。  比如功能测试这边的一个 2路10核 20个CPU的服务器  一...