JVM调优之类的加载过程_未完待续

类从被加载到虚拟机内存开始,到卸载出内存,他经历了加载、连接、初始化、使用和卸载五大部分,而在连接过程中,又包括验证、准备和解析三部分。下图就是虚拟机类加载的整个过程图。稍后,我们将每个阶段做逐一分析。

JVM调优之类的加载过程_未完待续

1.加载

“加载”是“类加载”过程的第一阶段,注意这两个词不能混淆了。他主要将类的二进制流加载到内存中的过程。这里的二进制流不仅限于.class文件,当然还包括但不限于以下几种情况。

1.1 二进制流的来源

1.1.1 非数组类的加载阶段

1)从Zip包中读取,这个很常见,最终成为常见的jar、EAR、WAR格式的基础。

2)从网络中获取,这种场景最典型的应用就是Applet。

3)运行时就算生成,这种场景使用的最多的就是动态代理技术。

4)有其他文件生成,最流行的就是JSP应用。

5)从数据库中读取,这种场景相对少见,例如有些中间件服务器。

1.1.2 数组类的加载阶段

1)如果数组的组件类型是引用类型,那就递归采用上面提到的非数组类的加载阶段,数组的组件类型将在加载该组件类型的类加载器的类名称空间被标识。

2)如果数组的组件类型不是引用类型(例如int[])Java虚拟机将会把数组组件类型标记为引导类加载器关联。

3)数组类的可见性与他的组件类型的可见性移植,如果组件类型不是引用类型,那数组类的可见性将默认为public。

1.2 类加载主要完成的任务

1)通过一个类的全限定名来湖区定义此类的二进制字节流。

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问入口。

2. 验证

验证作为连接阶段的第一步,目的是为了确保Class文件的字节路中包含的信息符合当期虚拟机的要求,放置危害虚拟机自身安全。验证阶段是非常重要的,他直接决定了Java虚拟机是否能承受恶意代码攻击。从执行性能的角度上讲,验证阶段的工作量在虚拟机的类加载子系统中占了相当大的一部分。

2.1 文件格式验证

这一阶段主要验证字节流是否符合Class文件格式规范,并且能被当前版本的虚拟机处理。这一阶段主要验证点包括如下:

1)是否以魔术0xCAFEBABE开头。

2)主次版本号是否在当前虚拟机处理范围之内。

3)常量池的常量中是否有不被支持的常量类型

4)指向常量的各种索引值是否有指向不存在的常量或不符合类型的常量。

5)CONSTANT_Utf8_info型的常量中是否有不符合UTF8编码的数据。

6)Class文件中各个部分及文件本身是否有被删除的或附加的其他信息。

。。。