在java的学习中,对于jvm模块我们会不断补充一些知识点,毕竟jvm是比较重要的一个组成部分。本篇围绕jvm加载器展开介绍,在加载类的时候,我们的加载器会逐个进行工作,在具体的加载器类型上,想必大家还不是很清楚。下面我们就java之jvm加载器的4中类型带来介绍。

1、bootstrap classloader (引导类加载器)

负责加载$java_home中jre/lib/rt.jar里所有的class,由c++实现的核心库,也就是jvm调用每个系统的api实现系统功能,实现跨平台的主要模块,不是classloader子类。开发者不能直接使用。

2、extension classloader (扩展类加载器)

负责加载java平台中扩展功能的一些jar包,包括$java_home中jre/lib/*.jar或-djava.ext.dirs指定目录下的jar包,开发者可以直接使用。

3、application classloader (应用加载)

负责记载classpath中指定的jar包及目录中class。根据需要,通过class的全限定名来加载类,可以通过classloader.getsystemclassloader()来获取它。

4、custom classloader (用户加载器)

属于应用程序根据自身需要自定义的classloader,继承java.lang.classloader类。如tomcat、jboss都会根据j2ee规范自行实现classloader。

实例扩展:

根类加载器(bootstraploader)

package jvmtest;

import java.net.url;

import sun.misc.launcher;

public class boot {
  public static void main(string[] args) {
    /*
     * 这里有可能报错 access restriction: the type 'launcher' is not api
     * 只需要将 全局属性project>preferences>java>compiler>errors/warnings>
     * 把右侧的【deprecated and restricted api>forbidden reference的error】置为【warning】.
     */
    url[] urls = sun.misc.launcher.getbootstrapclasspath().geturls();
    for(int i = 0; i < urls.length; i++) {
      system.out.println(urls[i].toexternalform());
    }
  }
}

当类被加载之后,系统为之生成一个对应的class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到jre中。类连接又可分为如下3个阶段。

验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。java是相对c++语言是安全的语言,例如它有c++不具有的数组越界的检查。这本身就是对自身安全的一种保护。验证阶段是java非常重要的一个阶段,它会直接的保证应用是否会被恶意入侵的一道重要的防线,越是严谨的验证机制越安全。验证的目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。其主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。

四种验证做进一步说明:

  1. 文件格式验证:主要验证字节流是否符合class文件格式规范,并且能被当前的虚拟机加载处理。例如:主,次版本号是否在当前虚拟机处理的范围之内。常量池中是否有不被支持的常量类型。指向常量的中的索引值是否存在不存在的常量或不符合类型的常量。
  2. 元数据验证:对字节码描述的信息进行语义的分析,分析是否符合java的语言语法的规范。
  3. 字节码验证:最重要的验证环节,分析数据流和控制,确定语义是合法的,符合逻辑的。主要的针对元数据验证后对方法体的验证。保证类方法在运行时不会有危害出现。
  4. 符号引用验证:主要是针对符号引用转换为直接引用的时候,是会延伸到第三解析阶段,主要去确定访问类型等涉及到引用的情况,主要是要保证引用一定会被访问到,不会出现类等无法访问的问题。

到此这篇关于java之jvm加载器例举的文章就介绍到这了,更多相关java之jvm加载器有几种内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!