首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

与小朋友共勉的有关java的JVM的知识(二)

2013-09-06 
与小伙伴共勉的有关java的JVM的知识(二)ClassLoader详解:1.BootstrapClassLoaderSun JDK采用C实现的此类,

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

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加载了,如果这两个类互相转换就会报错。


热点排行