您的位置:首页 > 编程语言 > Java开发

与小伙伴共勉的有关java的JVM的知识(二)

2013-09-02 10:23 232 查看
ClassLoader详解:

1.Bootstrap ClassLoader

Sun JDK采用C++实现的此类,此类并非ClassLoader的子类,在代码中没有办法拿到这个对象,Sun的JDK启动会初始化这个ClassLoader,并由他完成$JAVA_HOME中jre/lib/rt.jar里面所有的class文件的加载,jar中包涵了java规范定义的所有的接口及实现。

2.Extension ClassLoader

JVM用他来加载一些扩展功能的jar,例如Sun的jdk目录下有dns工具jar包等等,在Sun的JDK下该ClassLoader对应的类名为ExtClassLoader。

3.System ClassLoader

SUN的JDK用此ClassLoader来加载JVM启动启动参数中指定的ClassPath中的Jar包及目录,在Sun的 jdk中此ClassLoader对应的类名为AppClassLoader。

4.User-Define ClassLoader

User-Define ClassLoader是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader,此ClassLoader可用于加载非Classpath中中(例如从网络上下载的jar或者二进制)的jar文件及目录,还可以在加载前对class做一些额外的动作,例如类的解密等等。

JVM的ClassLoader采用的是树形结构,除了BootStrap以外,其他的ClassLoader都有其parent classLoader,User-Define ClassLoader默认的parent ClassLoader为System ClassLoader。类的加载通常也会按照树形结构,首先从parent ClassLoader中开始加载,当其中没有时尝试从System ClassLoader中加载,以此来避免同一个类被ClassLoader的不同实例加载多次。

JVM常见的异常介绍:

1.ClassNotFoundExcption

这是常见的一个异常,产生的原因是因为当前的ClassLoader中没有找到对应的类,判断System ClassLoader的类就是看该类是否在classpath中,如果是User -Define ClassLoader则要具体分析此ClassLoader加载类的过程。例如我们的反射中常用的Class.forname(“com.david.example.ClassA”),如果当前的ClassLoader中根本就没有该类所在的jar包或class文件,就回抛出ClassNotFoundException。

2.NotClassDefFoundError

此异常通常是由于一个类中引用了另外的一个类,而被引用的类没有被classLoader找到。如下面的例子:

Class Student(){
。。。。。。
private teacher = new Teacher();
。。。。。。
}


当ClassLoader加载时,虽然可以找到student的类,但是无法找到teacher的类,所以便会抛出此异常。

3.LinkageError

此异常产生的原因就是一个类被重复的加载了。

4.ClassCastException

此异常在我们使用泛型后,触发的几率很低。比较难找的是属于同一个类被不同的ClassLoader加载了,如果这两个类互相转换就会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: