欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: 五月的仓颉

媒介

我们知道我们写的措施颠末编译后成为了.class文件,.class文件中描写了类的各类信息,最终都需要加载虚拟机之后才气运行和利用。而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会产生什么变革?这些都是本文要讲的内容,文章将会讲授加载类加载的每个阶段Java虚拟机需要做什么事(加粗标红)。

类利用的7个阶段

类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包罗:加载(Loading)、验证(Verification)、筹备(Preparation)、理会(Resolution)、初始化(Initiallization)、利用(Using)和卸载(Unloading)这7个阶段。个中验证、筹备、理会3个部门统称为毗连(Linking),这七个阶段的产生顺序如下图:

 验证阶段将做<a href=劳务调派信息打点系统 一下几个事情" src="http://www.importnew.com/https:/images2015.cnblogs.com/blog/801753/201509/801753-20150928194629980-1976916805.png" />

图中,加载、验证、筹备、初始化、卸载这5个阶段的顺序是确定的,类的加载进程必需凭据这种顺序按部就班地开始,而理会阶段不必然:它在某些环境下可以初始化阶段之后在开始,这是为了支持Java语言的运行时绑定(也称为动态绑定)。接下来讲授加载、验证、筹备、理会、初始化五个步调,这五个步调构成了一个完整的类加载进程。利用没什么好说的,卸载属于GC的事情,在之前GC的文章中已经有所提及了。

加载Loading

加载是类加载的第一个阶段。有两种时时机触发类加载:

1、预加载。虚拟机启动时加载,加载的是JAVA_HOME/lib/下的rt.jar下的.class文件,这个jar包内里的内容是措施运行时非经常常用到的,昆山软件开发,像java.lang.*、java.util.*、java.io.*等等,因此跟着虚拟机一起加载。要证明这一点很简朴,写一个空的main函数,配置虚拟机参数为”-XX:+TraceClassLoading”来获取类加载信息,运行一下:

[Opened E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.Object from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.io.Serializable from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.Comparable from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.String from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.reflect.Type from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.Class from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
[Loaded java.lang.Cloneable from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]
...

2、运行时加载。虚拟机在用到一个.class文件的时候,会先去内存中查察一下这个.class文件有没有被加载,假如没有就会凭据类的全限命名来加载这个类。

那么,加载阶段做了什么,其实加载阶段做了有三件工作:

  • 获取.class文件的二进制流
  • 将类信息、静态变量、字节码、常量这些.class文件中的内容放入要领区中
  • 在内存中生成一个代表这个.class文件的java.lang.Class工具,作为要领区这个类的各类数据的会见进口。一般这个Class是在堆里的,不外HotSpot虚拟机较量非凡,这个Class工具是放在要领区中的
  • 虚拟机类型对这三点的要求并不详细,因此虚拟机实现与详细应用的机动度都是相当大的。譬喻第一条,基础没有指明二进制字节约要从那边来、怎么来,因此单单就这一条,就能变出很多格式来:

  • 从zip包中获取,这就是今后jar、ear、war名目标基本
  • 从网络中获取,典范应用就是Applet
  • 运行时计较生成,典范应用就是动态署理技能
  • 由其他文件生成,劳务派遣管理系统,典范应用就是JSP,即由JSP生成对应的.class文件
  • 从数据库中读取,这种场景较量少见
  • 总而言之,在类加载整个进程中,这部门是对付开拓者来说可控性最强的一个阶段。

    验证

    毗连阶段的第一步,这一阶段的目标是为了确保.class文件的字节约中包括的信息切合当前虚拟机的要求,而且不会危害虚拟机自身的安详。