与小伙伴共勉的有关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找到。如下面的例子:
当ClassLoader加载时,虽然可以找到student的类,但是无法找到teacher的类,所以便会抛出此异常。
3.LinkageError
此异常产生的原因就是一个类被重复的加载了。
4.ClassCastException
此异常在我们使用泛型后,触发的几率很低。比较难找的是属于同一个类被不同的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加载了,如果这两个类互相转换就会报错。
相关文章推荐
- [置顶] 与小伙伴共勉的java有关jvm的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子
- 与小伙伴共勉的java有关jvm的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子
- Java基础知识整理一(JRE、JVM、基…
- Java的一些基础小知识之JVM与GC (转)
- JAVA基础知识之JVM-——自定义类加载器
- java的线程安全、单例模式、JVM内存结构等知识学习和整理
- Java基础知识——SDK、JDK、JRE、JVM、JDT、CDT等之间的区别与联系
- java中static和this有关知识
- JAVA基础知识之JVM-——动态代理(AOP)
- Java基础知识――SDK、JDK、JRE、JVM、JDT、CDT等之间的区别与联系
- [置顶] java的线程安全、单例模式、JVM内存结构等知识学习和整理
- JAVA字符串的有关知识
- JAVA基础知识之JVM-——反射和泛型
- Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)
- Java内存回收知识(读书笔记)--深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)2.2~2.3
- 黑马程序员——Java基础---有关static(静态)的知识
- java jvm基础知识
- java、安卓、jvm、SpringBoot、Netty、Redis学习知识
- Java中有关注解和动态代理的知识
- java基础知识回顾之JDK/JRE/JVM