`
- 浏览:
332908 次
- 性别:
- 来自:
北京
-
JVM
jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序.
JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了
当一台机器上有多个jvm可选择的时候,jvm的选择步骤:
1)当前目录有没有jre目录(不准确),
2)父目录下的jre子目录
3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\
所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre\
运行java.exe找到了jre后有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致则会发生错误
java -verbose:class Main 显示调用的详细信息
classloader的两种载入方式:1)pre-loading预先载入,载入基础类 2)load-on-demand按需求载入
只有实例化一个类才会被classloader载入,仅仅申明并不会载入
java动态载入class的两种方式:
1)implicit隐式,即利用实例化才载入的特性来动态载入class
2)explicit显式方式,又分两种方式:
1)java.lang.Class的forName()方法
2)java.lang.ClassLoader的loadClass()方法
static块在什么时候执行?
1)当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行.
2)如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作
3)static块仅执行一次
Class类的实例.
>>Class类无法手工实例化,当载入任意类的时候自动创建一个该类对应的Class的实例,
>>某个类的所有实例内部都有一个栏位记录着该类对应的Class的实例的位置.,
>>每个java类对应的Class实例可以当作是类在内存中的代理人.所以当要获得类的信息(如有哪些类变量,有哪些方法)时,都可以让类对应的Class的实例代劳.java的Reflection机制就大量的使用这种方法来实现
>>每个java类都是由某个classLoader(ClassLoader的实例)来载入的,因此Class类别的实例中都会有
栏位记录他的ClassLoader的实例,如果该栏位为null,则表示该类别是由bootstrap loader载入的(也称root
laoder),bootstrap loader不是java所写成,所以没有实例.
原生方法:forName0()等方法,native修饰符
自定义ClassLoader:
如实例化一个URLClassLoader. URLClassLoader ucl = new URLClassLoader(new
URL[]{new
URL("file:/e:/bin/")}),URLClassLoader优先找当前目录,再在url中找.class加载.URL中别忘在最后加"
/"表示目录
各个java类由哪些classLoader加载?
1)java类可以通过实例.getClass.getClassLoader()得知
2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入
3)ClassLoader类由bootstrap loader载入
ClassLoader hierachy:
jvm建立->初始化动作->产生第一个ClassLoader,即bootstrap loader->bootstrap
loader在sum.misc.Launcher类里面的ExtClassLoader,并设定其Parent为null->bootstrap
loader载入sun.misc.Launcher$AppClassLoader,并设定其parent为ExtClassLoader(但是
AppClassLoader也是由bootstrap
loader所载入的)->AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者
bootstrap loader载入.
>>自定义的ClassLoader的.getParent()是AppClassLoader.parent和他的加载器并没有关系
>>ExtClassLoader和AppClassLoader都是URLClassLoader的子
类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由
运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定
>>ExtClassLoader查找的url是系统变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext
>>Bootstrap loader的查找url是sun.boot.class.path
>>在程序运行后调用System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前.sun.boot.class.path是在程序中写死的,完全不能修改
委派模型
当classloader有类需要载入时先让其parent搜寻其搜寻路径帮忙载入,如果parent找不到,在由自己搜寻自己的搜寻路径载入,ClassLoader hierachy本来就有这种性质
NoClassDefFoundError和ClassNotFoundException
NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件则报这个错
ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
4. 考虑Java 2版本的兼容性:学习如何修改你的ClassLoader以适应Java 2及以上版本的特性,比如支持Service Provider Interface (SPI)。 在深入学习之前,你需要理解类的生命周期,以及类加载、链接和初始化的概念。...
### Java虚拟机中ClassLoader概述与双亲委托机制详解 #### 一、ClassLoader概念与作用 在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`...
2. Extension ClassLoader:加载JDK扩展目录(如$JAVA_HOME/jre/lib/ext)中的类。 3. System ClassLoader(也称为AppClassLoader):加载`CLASSPATH`环境变量指定的类,以及应用主类路径(class path)上的类。 4. ...
二、创建自定义Classloader 创建自定义Classloader需要继承java.lang.ClassLoader类,并重写其关键方法,如`findClass(String name)`或`loadClass(String name)`。这两个方法分别用于查找指定类的字节码和实际加载...
2. **双亲委派模型** 这是一种为了防止类的重复加载和保证类加载的安全性而设计的机制。类加载请求会逐级向上委托,直到找到对应的类或者返回给最初发起请求的类加载器。 3. **ClassLoader的工作流程** - 加载:...
2. 类的可见性:不同的ClassLoader加载的类相互之间默认是不可见的,除非使用` ProtectionDomain`进行设置。 3. 性能:频繁的类加载会影响性能,因此应尽量减少不必要的类加载操作。 在实际应用中,我们可以通过...
二、ClassLoader的体系结构 ClassLoader形成一个树状结构,BootstrapClassLoader是根节点,ExtensionClassLoader是其子节点,SystemClassLoader是ExtensionClassLoader的子节点。用户还可以自定义ClassLoader,插入...
1. **加载**:加载是ClassLoader工作的起点,它从文件系统或网络中找到类的二进制数据,然后创建一个对应的Class对象。这个过程可以通过自定义ClassLoader来实现,比如从数据库中加载类。 2. **验证**:验证是确保...
ClassLoader是JVM中的一个重要组件,它的主要任务是加载类的二进制数据,转换为Class对象,并供Java应用程序使用。本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种...
`附录A.Java 2 SDK版原始码概观.pdf`可能提供了Java 2 SDK源码的概述,这对于理解ClassLoader的工作方式非常有帮助,因为你可以看到其内部的实现细节。 `CH_00-导读.pdf`则可能是整个系列的引导章节,介绍了接下来...
2. Extension ClassLoader:扩展类加载器。其主要任务是加载JRE的扩展目录下的JAR包,如JAVA_HOME/jre/lib/ext目录或由java.ext.dirs系统属性指定的路径。这种方式允许开发者添加JVM扩展功能,而无需修改核心类库。...
`findClass()` 方法则负责根据类名查找对应的二进制字节流,并转换为Class对象。 在描述中提到,该案例会通过控制台输入进行调试,这意味着我们需要实现一个交互式的类加载机制。用户可以输入类名或指定目录,然后...
2. **加载类**:找到`.class`文件后,ClassLoader将其读入内存,并创建一个Class对象。这个过程可能涉及字节码验证,确保类的安全性。 3. **链接**:链接阶段包括三个子步骤:验证、准备和解析。验证确保字节码符合...
- 加载:查找并加载类的二进制数据。数据可能来自JAR文件、网络或自定义的加载源。 - 验证:确保类文件的字节码符合Java语法规则,防止恶意代码的注入,保证JVM的安全运行。 - 准备:为类的静态变量分配内存,并初始...
2. Extension ClassLoader:扩展类加载器,负责加载JRE的扩展目录(jre/lib/ext目录下的jar文件)。 3. AppClassLoade:应用程序类加载器,也叫系统类加载器,负责加载用户类路径(classpath)上的类。 在Java中,...