与小伙伴共勉的有关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加载了,如果这两个类互相转换就会报错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值