java类加载机制
- 格式:doc
- 大小:38.50 KB
- 文档页数:3
类加载机制及SPI最近重温Java类加载及双亲委派机制,并写了⼀个SPI的例⼦从⽹上找了⼀张图⽚,对着图⽚及课堂笔记来梳理下。
⾸先java⾃带的类加载器分为BootStrapClassLoader(引导\启动类加载器),ExtClassLoader(扩展类加载器),AppClassLoader(应⽤程序类加载器)三种,此外还⽀持⽤户⾃⼰定义的⾃定义类加载器,加载的是⽤户⾃⼰指定的⽬录。
BootStrapClassLoader:jvm中,c++处理类加载的这套逻辑,被称为启动类加载器,是由c++编写的,在java中为null,加载的路径是Jre/lib/rt.jar, 在这个过程中会通过启动类加载器,来加载uncherHelper,并执⾏checkAndLoadMain,以及加载main函数所在的类,并启动扩展类加载器、应⽤类加载器ExtClassLoader: 扩展类加载器,加载的是Jre/lib/ext/*.jar,查看⽅式:public static void main(String[] args) {ClassLoader classLoader = ClassLoader.getSystemClassLoader().getParent();URLClassLoader urlClassLoader = (URLClassLoader) classLoader;URL[] urls = urlClassLoader.getURLs();for (URL url : urls) {System.out.println(url);}}AppClassLoader: 应⽤类加载器,加载⽤户程序的类加载器,加载的是CLASS_PATH中指定的所有jarpublic static void main(String[] args) {String[] urls = System.getProperty("java.class.path").split(":");for (String url : urls) {System.out.println(url);}System.out.println("---------------------------------------------------------");URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();URL[] urls1 = classLoader.getURLs();for (URL url : urls1) {System.out.println(url);}}双亲委派机制:类加载时,AppClassLoader 会先查看⾃⾝是否已经加载过当前class⽂件,如果加载过则直接返回,如果没有加载过,则委托他的⽗类(ExtClassLoader)尝试进⾏加载,ExtClassLoader也会先查看⾃⼰是否加载过,加载过则直接返回,没有加载过,则继续委派给BootStrapClassLoader,如果直⾄BootStrapClassLoader都没有加载过,则会AppClassLoader会尝试进⾏加载。
java 类里的loadclass用法Java中的loadClass()方法是在Class类中定义的一个方法,用于动态加载类。
在程序运行时可以根据类的全限定名来加载指定的类文件,并返回对应的Class对象。
loadClass()方法的语法如下:`public Class<?> loadClass(String name) throws ClassNotFoundException`这个方法可以在当前的ClassLoader中通过类的全限定名来加载指定的类文件。
如果找不到该类文件,则会抛出ClassNotFoundException异常。
下面将详细介绍loadClass()方法的使用以及相关概念和实例。
1. 理解Java类加载器在介绍loadClass()方法之前,先来了解一下Java类加载器。
类加载器是Java虚拟机(JVM)的一个组件,用于从文件系统、网络或其他来源加载Java类文件。
Java虚拟机通过类加载器来定位并加载类文件,将其转换为一个Class对象,并存放在方法区(即运行时数据区域之一)。
一个Java类加载器通常是由一个ClassLoader类的实例来表示的。
Java 提供了三种内置的ClassLoader:- Bootstrap ClassLoader:负责加载Java核心类库,是虚拟机的一部分,无法直接获取。
- Extension ClassLoader:负责加载Java扩展库,如javax包下的类。
- System ClassLoader:也称为Application ClassLoader,负责加载应用程序的类,可以通过ClassLoader.getSystemClassLoader()来获取。
2. 使用loadClass()方法动态加载类loadClass()方法是ClassLoader类的一个原生方法,可以通过子类来调用。
在调用loadClass()方法时,会按照ClassLoader的委派模型进行类的加载。
classloader加载原理classloader是java中一个比较重要的类加载器,每一个程序和类都会存在一个classloader,classloader有三种主要的工作:加载类的二进制字节流、连接、初始化。
一、Classloader加载机制1、首先classloader会按照特定的方式去搜索类文件,当它找到了相应的类文件之后,它会将这个类文件转换成为二进制字节流,这里涉及到编译程序,classloader会使用编译程序将源程序编译成可执行文件。
2、接下来classloader会将这些二进制字节流存储在内存中,然后classloader会连接这些字节流,这一步是它将这些字节流组装成一个完整的类文件,这里涉及到类的加载,这些加载的类可以被访问,但是它们的代码还未被执行。
3、最后classloader会初始化这些加载的类,这一步就是它将这些类的代码执行,这里classloader会执行所有类变量的初始化,同时也会执行所有静态代码块的内容,最后我们就可以得到一个完整的类文件。
二、Classloader的三种类型1、Bootstrap Classloader:它是用来加载JRE的核心类的,它的实现是C++语言,它的加载范围是从<JAVA_HOME>lib下面开始,这个类加载器不需要程序员编写任何外部类。
2、Extension Classloader:它是用来加载扩展类的,从<JAVA_HOME>libext开始加载,它继承自Bootstrap Classloader,这种类加载器也不需要程序员手动编写任何外部类。
3、Application Classloader:它是用来加载程序类的,它继承自Extension Classloader,它从ClassPath(来自系统变量或者命令行参数)所指定的路径中加载类,但是它不会加载扩展类。
三、Classloader安全机制1、安全性验证:Classloader在加载类的时候会先验证这个类文件,检查它是否符合class文件格式,其次classloader会过滤掉由它本身加载的不安全的类,这涉及到安全管理器的配置,例如:可以设置它只能加载特定的域名下的类文件。
jvm 打印类加载参数JVM(Java虚拟机)是Java程序的运行环境,它扮演着将Java字节码转换为机器码并执行的关键角色。
在Java应用程序启动时,JVM会负责加载类并执行相应的操作。
本文将深入探讨JVM的类加载过程,并分析其中的参数。
一、类加载概述在Java中,类是代码的基本组织单元,它被封装在Java源文件中,并经过编译为字节码文件(.class)。
类加载是将字节码文件加载到JVM中并转换为可执行代码的过程。
JVM的类加载机制具有懒加载的特点,即在需要使用某个类时才会加载它。
二、类加载过程1.加载(Loading):将字节码文件加载到JVM中,它可以通过文件系统、网络等方式获取字节码文件。
加载后的类会被存放在方法区(Method Area)中,并被分配一个唯一的类加载器实例。
2.链接(Linking):链接分为三个阶段,包括验证(Verification)、准备(Preparation)和解析(Resolution)。
- 验证:确保字节码文件符合JVM规范,不包含安全漏洞。
- 准备:为类的静态变量分配内存,并设置默认初值。
- 解析:将符号引用转换为直接引用,以便JVM能够快速访问到类、方法和字段。
3.初始化(Initialization):执行类的初始化代码,包括静态变量赋值和静态块的执行。
初始化是类加载过程中的最后一步,只有当类被使用时才会触发。
三、类加载参数1.-verbose:class该参数用于打印类加载的详细信息,包括类的加载、链接和初始化过程。
通过查看该输出信息,可以了解到类加载器的工作情况,以及类加载的顺序和时间等。
2.-Xbootclasspath/a:path该参数用于指定引导类加载器搜索类的路径。
在Java应用程序启动时,引导类加载器会先搜索这个路径下的类,如果找到了对应的类,则直接加载,不再使用默认的搜索路径。
这个参数可以用来加载自定义的类或者覆盖JDK中的类。
3.-Xms<size>和-Xmx<size>这两个参数用于指定JVM的初始堆大小和最大堆大小。
ClassLoader是Java中的类加载器,它的主要工作是将Class加载到JVM中。
以下是其运行机制:
1. 父优先加载机制:ClassLoader采用了一种“父优先”的等级加载机制,也就是说,当一个类需要被加载时,ClassLoader会首先检查它的父类是否已经被加载。
如果父类已经被加载,那么就直接使用父类的类对象;如果父类还没有被加载,那么就先加载父类,然后再加载当前类。
这种机制也适用于同一加载器中加载的类之间的依赖关系。
2. 类加载过程:当一个类需要被加载时,ClassLoader会首先找到这个类的class文件,并把这个文件包含的字节码加载进内存。
然后,它会对这些字节码进行解析和初始化。
在解析过程中,ClassLoader 会将类字节码重新解析成JVM统一要求的对象格式,并生成类的Class对象。
3. 显示和隐式加载:ClassLoader有两种加载方式:显示加载和隐式加载。
隐式加载是指不需要代码调用类加载器加载需要的类,而是通过JVM自动加载。
显示加载则需要调用类加载器来加载类。
比如,使用类Class中的forName()方法、ClassLoader中的loadClass()方法或findSystemClass()方法等来加载类。
总的来说,ClassLoader在Java中扮演着非常重要的角色,它负责将Class加载到JVM中,并审查每个类应该由谁来加载,以及将类字节码重新解析成JVM统一的对象格式。
java类加载方法
Java类加载是指将Java字节码文件加载到Java虚拟机中,并将其转换为可执行的Java类的过程。
Java类加载器是用于动态加载Java类的一种机制。
Java类加载器负责查找Java类并加载它们。
Java类加载器有三种类型:启动类加载器、扩展类加载器和应用程序类加载器。
启动类加载器负责加载Java类库,扩展类加载器负责加载扩展库,而应用程序类加载器则加载应用程序中的类。
类加载过程包括加载、验证、准备和解析阶段。
加载阶段负责查找和加载类的字节码,验证阶段则验证类的字节码是否合法,准备阶段则为类的静态变量分配空间并初始化,而解析阶段则处理类之间的引用关系。
Java还支持动态类加载,这是一种在运行时加载类的机制。
动态类加载允许在程序运行时根据需要动态加载类,这有助于提高程序的灵活性和可扩展性。
动态类加载通常使用反射机制来实现。
- 1 -。
JVM运行机制及其原理JVM(Java Virtual Machine)是Java虚拟机的缩写,是运行Java 字节码的虚拟计算机。
它是Java平台的核心组件,负责在不同的操作系统上执行Java程序。
JVM运行机制主要包括类加载、字节码解释、即时编译、垃圾收集等过程,下面将详细介绍JVM运行机制及其原理。
1.类加载当一个Java程序被运行时,JVM会首先加载程序的主类,然后根据程序的依赖关系逐步加载相关的类。
类加载过程主要分为加载、验证、准备、解析和初始化几个阶段:-加载:通过类加载器将类文件加载到内存中。
- 验证:确保加载的类符合Java语言规范和JVM规范。
-准备:为类的静态变量分配内存并初始化为默认值。
-解析:将符号引用转换为直接引用。
-初始化:执行类的初始化方法。
2.字节码解释加载完类文件后,JVM会通过解释器将字节码文件逐条解释执行,将每条字节码翻译成对应的机器代码并执行。
这种方式简单直接,但效率较低,适用于少量代码和频繁切换的情况。
3.即时编译4.垃圾收集JVM还负责管理程序的内存,包括分配内存、回收无用内存等。
在Java中,内存是通过堆和栈来管理的,堆用于存放对象实例,栈用于存放基本数据类型和方法调用。
JVM通过垃圾收集器来管理堆内存,自动回收不再使用的对象,并将内存释放出来供其他对象使用。
5.类加载器类加载器是JVM的重要组成部分,负责加载class文件,并将其转换成JVM可以识别的数据结构。
JVM中存在多个类加载器,分为三个级别:启动类加载器、扩展类加载器和应用程序类加载器。
类加载器采用双亲委派模型,当需要加载一个类时,先委托给父类加载器加载,只有当父类加载器无法找到类时,才由自己加载。
6.内存模型JVM中的内存分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等几部分。
程序计数器记录当前指令执行的位置;虚拟机栈用于存放局部变量表和操作数栈;本地方法栈用于支持本地方法调用;堆用于存放对象实例;方法区用于存放类信息、静态变量等。
java热加载原理
Java热加载原理
Java热加载是指在应用程序运行过程中,动态地更新类的定义,而无
需重新启动应用程序。
这种技术可以提高应用程序的可用性和灵活性,同时也可以减少应用程序的停机时间。
Java热加载的原理是通过Java虚拟机(JVM)的类加载器实现的。
在Java中,类加载器负责将类加载到JVM中,并将其转换为可执行代码。
当应用程序需要使用一个类时,JVM会检查该类是否已经加载到内存中。
如果没有加载,则会调用类加载器来加载该类。
在Java热加载中,类加载器会监视类文件的变化。
当类文件发生变化时,类加载器会重新加载该类,并将其转换为可执行代码。
这样,应
用程序就可以使用最新的类定义,而无需重新启动应用程序。
Java热加载的实现方式有多种,其中最常见的方式是使用Java的反射机制。
反射机制允许程序在运行时动态地获取类的信息,并调用类的
方法。
通过反射机制,程序可以在运行时重新加载类,并更新类的定义。
Java热加载的优点是可以提高应用程序的可用性和灵活性。
例如,在一个Web应用程序中,如果需要更新一个类的定义,传统的方式是停止应用程序,更新类文件,然后重新启动应用程序。
这样会导致应用程序的停机时间较长,影响用户体验。
而使用Java热加载技术,可以在不停止应用程序的情况下更新类的定义,从而减少应用程序的停机时间。
总之,Java热加载是一种非常有用的技术,可以提高应用程序的可用性和灵活性。
通过了解Java热加载的原理和实现方式,开发人员可以更好地利用这种技术,从而提高应用程序的性能和用户体验。
Java类加载器(classloader)及类加载路径简介
2010-11-17 20:24:48| 分类:编程技术| 标签:java 编程|字号大中小订阅
昨天,看一个build Standalone中databrusher的一个脚本,发现一个Java类似乎没有在classpath中,好像也可一直运行了。
很疑惑,问了对应的开发同学,然后自己好好看了下它的代码,才知道了原理。
命令是:$JAVA_HOME/bin/java $JAVA_OPTS com.alibaba.standalone.AppStartor
com.alibaba.intl.standalone.databrusher.Startor "$main_class" "$signal_file" "$recivers"
原理是:Java根据classpath找到,com.alibaba.standalone.AppStartor这个class,运行这个class,会启动一个classloader来加载com.alibaba.intl.standalone.databrusher.Startor(在里面会指定到WORLDS-INF目录下加载类),然后com.alibaba.intl.standalone.databrusher.Startor会启动对应的
"$main_class".
然后,花了挺多时间好好看了一下Java的classloader,了解一下其中的原理和看了下代码。
下面也简单
总结一下吧。
java虚拟机是由uncher来初始化的,也就是java(或java.exe)这个程序来做的.虚拟机按以下
顺序搜索并装载所有需要的类:
1,引导类:组成java平台的类,包含rt.jar和i18n.jar等基础jar包中的类.
2,扩展类:使用java扩展机制的类,都是位于扩展目录($JAVA_HOME/jre/lib/ext)中的.jar档案包.
3,用户类:开发者定义的类或者没有使用java扩展机制的第三方产品.你必须在命令行中使用-classpath选项或者使用CLASSPATH环境变量来确定这些类的位,或者自己写ClassLoader加载。
Java的class loader的大致情况如下图所示:
/prevPhDownload.do?host=renyongjie668&albumId=197449439&phot
oId=6568564371
bootstrap classloader -->extension classloader-->system classloader
虚拟机一启动,会先做一些初始化的动作。
一旦初始化动作完成之后,就会产生第一个类加载器,即所谓的Bootstrap ClassLoader,Bootstrap ClassLoader 是由C++ 所撰写而成,这个Bootstrap Loader所做的初始工作中,除了也做一些基本的初始化动作之外,最重要的就是加载定义在sun.misc 命名空间底下的Launcher.java 之中的ExtClassLoader( 因为是inner class ,所以编译之后会变成Launcher$ExtClassLoader.class) ,并设定其Parent 为null,代表其父加载器为Bootstrap Loader 。
然后Bootstrap Loader ,再要求加载定义于sun.misc 命名空间底下的Launcher.java 之中的AppClassLoader( 因为是inner class,所以编译之后会变成Launcher$AppClassLoader.class) ,并设定其Parent 为
之前产生的ExtClassLoader 实例。
a. Bootstrap ClassLoader/启动类加载器
主要负责java_home/jre/lib目录下的核心api 或-Xbootclasspath 选项指定的jar包装入工作.
b. Extension ClassLoader/扩展类加载器
主要负责java_home/jre/lib/ext目录下的jar包或-Djava.ext.dirs 指定目录下的jar包装入工作
c. System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path或$CLASSPATH变量所指的目录下的类与jar包装入工作. (这里需要说明的是,如果$CLASSPATH为空,jdk会默认将被运行的Java类的当前路径作为一个默认的$CLASSPATH,一但设置了$CLASSPATH变量,则会到$CLASSPATH对应的路径下去寻找相应的类,
找不到就会报错。
这个结论,我已经经过测试,并且看了下类加载器中源代码)
d. User Custom ClassLoader/用户自定义类加载类(ng.ClassLoader的子类)在程序运行期间, 通
过ng.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.
为了有更多的了解,写了个简单的Java程序对前面三种classloader能加载类的路径及其parent类进行了
测试。
代码如下:
import .URL;
import .URLClassLoader;
/**
* @className: IClassLoader
* @description: 测试三种classloader加载类的路径,及其parent
* @author: 笑遍世界
* @createTime: 2010-11-17 下午07:33:40
*/
public class IClassLoader {
public static void main(String[] args) {
// 测试bootstrap classloader 的类加载路径
URL[] urls=uncher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i].toExternalForm());
}
// 测试extension classloader 的类加载路径,先打印一个路径,再打印出其parent,然后再打印出类加载路径中的所有jar包
System.out.println("-------------------------------------");
System.out.println(System.getProperty("java.ext.dirs"));
ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
System.out.println("the parent of extension classloader : "+extensionClassloader.getParent()); System.out.println("extension classloader can use thess jars:");
URL[] extURLs = ((URLClassLoader)ClassLoader.getSystemClassLoader().getParent()).getURLs(); for (int i = 0; i < extURLs.length; i++) {
System.out.println(extURLs[i]);
}
// 测试system classloader 的类加载路径,其实也就时classpath的路径,并打印出它的parent System.out.println("-------------------------------------");
System.out.println(System.getProperty("java.class.path"));
System.out.println(ClassLoader.getSystemResource(""));
ClassLoader systemClassloader=ClassLoader.getSystemClassLoader();
System.out.println("the parent of system classloader : "+systemClassloader.getParent());
}
}
本机(linux+jdk1.5)运行结果如下:
关于Java的classloader其原理还是需要好好理解才能清楚的,仅通过一天的了解,记录为上面那么多吧。
更多详细信息,可以参考如下资料:
/blog/307083
/blog/426382
/zdwzzu2006/archive/2008/04/05/2253982.aspx
/blog/703842
/yangzhibin_bai/blog/item/78846cce1cb86b0992457ead.html
/clraychen/archive/2008/02/20/180868.html。