关于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加载class文件到内存的方式
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、ClassNotFoundException
JVM要加载指定的文件的字节码到内存中,但是并没有发现这个文件的字节码。检查方法就是在classpath中看看是否有指定文件存在。
2、NoClassDefFoundError
JVM规范中这个异常出现的情况是使用new 关键字、属性引用类、实现接口、继承类,如果不存在,会报这个异常。
3、ClassCastException
对于普通对象,对象必须是目标类的实例或者目标类的子类的实例,如果目标类是接口,那么会把他当做实现了该接口的一个子类。
有哪些需要自定义ClassLoader的情况?
1、在自定义的路径下查找自定义的classs文件,需要的文件并不是classpath下面的;
2、对于加载的类做特殊的处理,例如网络传输的安全性等;
3、可以定义类的失效机制,例如检查到文件被修改,则重新加载,从而实现类的热部署;
http://iamzhongyong.iteye.com/blog/2091549
关于JVM的ClassLoader(转)的更多相关文章
- JVM的ClassLoader过程分析
本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ...
- java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制
ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...
- JVM思考-ClassLoader.loadClasshe和Class.forName区别
JVM思考-ClassLoader.loadClasshe和Class.forName区别 目录:JVM总括:目录 见博客第四节:JVM总括四-类加载过程.双亲委派模型.对象实例化过程
- JVM和ClassLoader
JVM和ClassLoader 2019-11-08 目录 1 JVM架构整体架构 1.1 类加载器子系统 1.1.1 加载 1.1.2 链接 1.1.3 初始化 1.2 运行时数据区(Runtime ...
- JVM的classloader(转)
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存. 这四个类加载器分别为:Bootstrap ClassLoader.Extension Class ...
- JVM 系列 ClassLoader
JVM 系列()ClassLoader 在前面一节中,主要介绍了 Class 的装载过程,Class 的装载大体上可以分为加载类.连接类和初始化 3 个阶段.本小节将主要介绍绍 Java 语言中的 C ...
- JVM中ClassLoader的学习
JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...
- jvm学习-ClassLoader(二)
ClassLoader结构 jdk加载的4个步骤 CustomClassLoader 用户自定义的classLoader APPClassLoader主要加载classPath下面的class Ext ...
- JVM(三)JVM的ClassLoader类加载器
1.类加载的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括: (1)加载 (2)验证 (3)准备 (4)解析 (5)初始化 (6)使用 (7)卸载 一共7个阶段.其中验 ...
随机推荐
- uva 10127 - Ones(数论)
题目链接:uva 10127 - Ones 题目大意:给出n,问说者少要多少为1才干够整除n. 解题思路:等于是高精度取模,直到余数为0为止. #include <cstdio> #inc ...
- SQLiteLog (1) no such Column:
今天在进入sqlite数据库查询的时候出现了这个问题,SQLiteLog (1) no such Column: BGZ 搜索得知这是因为数据库中没有这一列,我的sql语句为" ...
- HDU2795 Billboard 【线段树】+【单点更新】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 让程序在崩溃时体面的退出之Dump文件
在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但 ...
- Get Cordova Ready for Grunt and CoffeeScript
Cordova, Grunt and Coffee You may reference to below if you deside to work with coffee instead of Ja ...
- Duanxx的C++学习: 使用类没有被定义 原因及解决方法
今天,随着C++写的神经网络算法.我发现了一个很令人费解的问题,下面的描述一般地描述,例如: 我有两个类ClassA和ClassB,它们分别有成员变量a.b; ClassA有一个函数是这种:Funct ...
- 构建基于Jenkins + Github的持续集成环境
搭建持续集成首先要了解什么是持续集成,带着明确的目标去搭建持续集成环境才能让我们少走很多弯路.持续集成(Continuous integration)简称CI,是一种软件开发的实践,可以让团队在持续集 ...
- 阻塞队列BlockingQueue用法(转)
多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另外又有若干个消费者线程.如果生产者线程需 ...
- nohup命令与&区别,jobs,fg,bg,Ctrl-Z、Ctrl-C、Ctrl-D
&方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/my ...
- HTML5 Canvas阴影用法演示
HTML5 Canvas阴影用法演示 HTML5 Canvas中提供了设置阴影的四个属性值分别为: context.shadowColor = “red” 表示设置阴影颜色为红色 context.sh ...