`
iamzhongyong
  • 浏览: 796444 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于JVM的ClassLoader(笔记)

 
阅读更多

     众所周知,java是编译型的语言,写的是java文件,最后运行的是class文件,class文件是运行在JVM之中的,这时候就有一个问题,JVM如何装载class文件的?是通过ClassLoader来进行的,这里做一下笔记,因为发现原作者写的很好《深入分析java web 技术内幕》。

ClassLoader的结构分析

    ClassLoader是一个抽象类,他有很多子类,JVM默认有几个实现类,当然我们也可以自己继承ClassLoader。

    1、defineClass:将byte字节转换为JVM能够识别的Class对象,这样就意味着可以是class文件也可是是网络上的字节流了;

    2、defineClass通常和findClass一起使用,findClass的作用是取得要加载的类的字节码;

    3、如果想在类被加载到JVM的时候就被链接,可以调用resolveClass来完成;

    4、如果不想自定义加载类的规则,也没有复杂的逻辑,可以通过this.getClass().getClassLoader().loadClass("") 来进行加载;

 

ClassLoader中的几个实现类

    1、Bootstrap ClassLoader 这个是JVM加载自身工作需要的类,完全由JVM自己来控制,外部无法访问到这个;

    2、ExtClassLoader比较特殊的,服务的特定目标在System.getProperty("java.ext.dirs");

    3、AppClassLoader,父类是ExtClassLoader,"java.class.path"中的类都可以被这个类加载器加载;

    4、URLClassLoader,一般这个类帮我们实现了大部分的工作,自定义可以继承这个类,这样仅仅在需要的地方做修改就行了;

 

JVM加载clas文件到内存的方式

    1、显示加载:不通过代码里的ClassLoader调用,而是JVM来自动加载类到内存中的方式;

            1.1、通过Class中的forName;

            1.2、通过ClassLoader中的loadClass

            1.3、通过ClasLoader中的findSystemClass

    2、隐身加载:通过代码中ClassLoader来加载的方式;

 

如何加载class文件

    1、找到.class文件,并把文件中包含的byte加载到内存中

    2、验证和解析

          2.1、字节码验证,确保格式正确和行为正确

          2.2、类准备,类中定义的字段、方法和实现接口锁必须的数据结构

          2.3、解析,装入类所引用的其他所有类,如父类、字段、方法签名、方法中使用的本地变量等

    3、静态属性和初始化赋值,以及静态块的执行等

 

关于类加载过程中的几种常见异常

1、ClassNotFindException

    JVM要加载指定的文件的字节码到内存中,但是并没有发现这个文件的字节码。检查方法就是在classpath中看看是否有指定文件存在。

2、NoClassDefFoundError

    JVM规范中这个异常出现的情况是使用new 关键字、属性引用类、实现接口、继承类,如果不存在,会报这个异常。

3、ClassCastException

    对于普通对象,对象必须是目标类的实例或者目标类的子类的实例,如果目标类是接口,那么会把他当做实现了该接口的一个子类。

 

有哪些需要自定义ClassLoader的情况?

1、在自定义的路径下查找自定义的classs文件,需要的文件并不是classpath下面的;

2、对于加载的类做特殊的处理,例如网络传输的安全性等;

3、可以定义类的失效机制,例如检查到文件被修改,则重新加载,从而实现类的热部署;

 

1
1
分享到:
评论

相关推荐

    深入Java虚拟机JVM类加载学习笔记

    深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc

    笔记 — JVM内存结构

    JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)。 下面我们从每个区域的用途,涉及的问题等方面来简单的说一说JVM的内存结构。 方法区 作用:用于存放已被加载的...

    Java学习笔记

    类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 健壮 3.面向对象 面向过程: 程序:函数+变量 (算法+数据结构) 面向对象: 如:SmallTalk 程序:对象和对象相互之间的“通讯” ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对应关系。必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容...

    java8rt.jar源码-fwh-JVM:对于JVM情况

    classLoader , Java 准备: Markdown编写工具 有道云笔记 Idea开发工具 GItHub项目地址 分析: 类加载运行全过程: 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。 public...

    java8源码-note:笔记

    关于JVM 1.5 泛型 1.6 锁 1.7 浮点数 1.8 ArrayList.toArray() 1.9 String 1.10 HTTP 1.11 HashMap 2.进阶 2.1 关于Java8 stream的使用 2.2 关于读写分离遇到的问题 2.3 对象引用类型 2.4 ThreadLocal的问题根源 2.5...

    day021-反射和注解笔记和代码.rar

    3、Class的实例就看成是Java中我们学过的所有的数据类型在JVM中存在的一种状态(字节码对象) String.class int.class List.class int[].class 1.概念:通过一个全限定类名,获取字节码文件 2...

    Note_scalad.tar.gz

    Java_ClassLoader Java_Copy_On_Write Java_Exception Java_ExecutorService Java_IO Java_JVM_Monitor Java_Jstat Java_Lambda Java_Memory Java_Node Java_Photo_Base64AndZip Java_Request_GetIP Java_Shiro_...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    探索JVM底层奥秘ClassLoader源码分析与案例讲解.wmv │ │ │ ├─3.锁、分布式锁、无锁实战全局性ID-悟空 │ │ 3.锁、分布式锁、无锁实战全局性ID-悟空.mp4 │ │ │ ├─4.SpringMvc深入理解源码分析 │ │ 4....

Global site tag (gtag.js) - Google Analytics