谈起java语言,不得不说的就是jvm虚拟机。主要由于jvm实现了“平台无关性”。编译后的java程序指令并不能直接在硬件系统CPU上执行,而是由JVM执行。JVM屏蔽了与具体平台相关的信息,使得java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此jvm是java程序能在多平台进行无缝移植的可靠保证,同时jvm也是java程序安全检查的检测引擎。
图片摘自javapapers网站:http://javapapers.com
ClassLoader Subsystem,加载器子系统 专用来加载.class文件,注意只载入需要的类文件到JVM中的运行时数据区域中,但不负责类的执行与否
Runtime Data Area,运行时数据区 提供程序运行时所需要的数据,包含方法区、堆、java栈、PC寄存器、本地方法栈
Execution Engine,执行引擎 包含两部分:JIT和GC,而JIT用于执行字节码,或执行本地方法;执行过程采用的是自定义的一套指令系统。GC则用于堆内存空间的回收管理。
Native Method Interface和Library,本地方法接口和本地方法库
类加载器是一个用来加载类文件的类,名为ClassLoader。java源代码通过javac编译器编译成class文件,然后由jvm的执行引擎来负责程序实行。那么类加载器负责加载文件系统、网络或其他来源的类文件,默认有三种类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(也叫APPClassLoader)。
Bootstrap类加载器:也称为初始类加载器。对应JRE/lib/rt.jar PS:负责加载rt.jar中的JDK类文件,它是所有类加载器的父加载器。Bootstrap类加载器没有任何父类加载器,如果你调用String.class.getClassLoader(),会返回null,任何基于此的代码会抛出NUllPointerException异常。
Extension类加载器:对应JRE/lib/ext或java.ext.dirs指向的目录。 PS:负责将加载类的请求先委托给它的父加载器,也就是Bootstrap,如果没有成功加载的话,再从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类。Extension加载器由sun.misc.Launcher$ExtClassLoader实现。
APPClassLoader类加载器:对应ClassPath环境变量,或由-classpath或-cp选项定义,或者是JAR中的Manifest的classpath属性定义. PS:其负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath或-cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。application类加载器是Extension类加载器的子加载器。通过sun.misc.Launcher$AppClassLoader实现。
用户自定义类加载器:该加载器是留给程序员拓展用的,主要实现是通过java.lang.ClassLoader来继承实现的
PS:该部分此处不详细展开,后续会单独专题来做深入的学习和探讨
新闻热点
疑难解答