文末有彩蛋!!!!!!
类加载
对于虚拟机来说,一个对象的创建十分复杂,包含了很多步骤。首先,我们要从类加载说起。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载这7个阶段,类加载包含了前五个,具体如图:
1522982931(1).png
一个.java文件在编译后会形成一个或多个class文件(若有内部类,则编译后会产生多个.class文件),但这些class文件中的信息,只有被加载到虚拟机中才能被运行和使用。
虚拟机把类的数据从class文件加载到内存,并对class文件中的数据进行校验、转换、解析、初始化等操作后,最终形成可以被虚拟机识别并使用的过程就叫做“虚拟机的类加载”。
接下来,笔者就对于其中的一些步骤进行详细的说明。
加载
“加载”是类加载中的一个过程,并且是通过类加载器来完成的。但是,什么时候会进行“加载”,虚拟机规范中并没有强制约束,而是交给具体的虚拟机实现来完成。
在此阶段中,虚拟机需要完成以下步骤:
通过全限定类名来获取类的二进制字节流,获取的方式可以通过jar包、war包、网络、JSP文件等方式获取,通过都是通过.class文件中获取的。
获取到字节流后,会将字节流中的信息转化为方法区中的运行时数据结构。
在内存中,生成代表该类的Class对象,作为访问该类的数据入口。在HotSpot中,Class对象并不存在于JVM虚拟机堆中,而是存在于方法区中。
在虚拟机中,当程序主动使用某个类时,如果该类还未被加载到内存中,JVM虚拟机会进行加载操作,直至初始化完成。
关于类加载器的话题,笔者在后面会有单独一章进行阐述。
验证
在完成加载阶段后,JVM虚拟机开始验证阶段,此阶段的目的很简单,很