- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深入JVM内核——原理、诊断与优化 第6周
法律声明
【声明】本视频和幻灯片为炼数成金网络课程的教学资料,所有资料只能在课程内使用,不得在课程以外范围散播,违者将可能被追究法律和经济责任。
课程详情访问炼数成金培训网站
类装载器
class装载验证流程
什么是类装载器ClassLoader
JDK中ClassLoader默认设计模式
打破常规模式
热替换
class装载验证流程
加载
链接
验证
准备
解析
初始化
class装载验证流程 -加载
装载类的第一个阶段
取得类的二进制流
转为方法区数据结构
在Java堆中生成对应的java.lang.Class对象
class装载验证流程 -链接 验证
链接 - 验证
目的:保证Class流的格式是正确的
文件格式的验证
是否以0xCAFEBABE开头
版本号是否合理
元数据验证
是否有父类
继承了final类?
非抽象类实现了所有的抽象方法
字节码验证 (很复杂)
运行检查
栈数据类型和操作码数据参数吻合
跳转指令指定到合理的位置
符号引用验证
常量池中描述类是否存在
访问的方法或字段是否存在且有足够的权限
class装载验证流程 -链接 准备
链接 - 准备
分配内存,并为类设置初始值 (方法区中)
public static int v=1;
在准备阶段中,v会被设置为0
在初始化的clinit中才会被设置为1
对于static final类型,在准备阶段就会被赋上正确的值
public static final int v=1;
class装载验证流程 - 链接 解析
链接 - 解析
符号引用替换为直接引用
字符串
引用对象不一定被加载
指针或者地址偏移量
引用对象一定在内存
class装载验证流程 – 初始化
执行类构造器clinit
static变量 赋值语句
static{}语句
子类的clinit调用前保证父类的clinit被调用
clinit是线程安全的
class装载验证流程
Java.lang.NoSuchFieldError错误可能在什么阶段抛出
什么是类装载器ClassLoader
ClassLoader是一个抽象类
ClassLoader的实例将读入Java字节码将类装载到JVM中
ClassLoader可以定制,满足不同的字节码流获取方式
ClassLoader负责类装载过程中的加载阶段
JDK中ClassLoader默认设计模式
ClassLoader的重要方法
public Class? loadClass(String name) throws ClassNotFoundException
载入并返回一个Class
protected final Class? defineClass(byte[] b, int off, int len)
定义一个类,不公开调用
protected Class? findClass(String name) throws ClassNotFoundException
loadClass回调该方法,自定义ClassLoader的推荐做法
protected final Class? findLoadedClass(String name)
寻找已经加载的类
JDK中ClassLoader默认设计模式 – 分类
BootStrap ClassLoader (启动ClassLoader)
Extension ClassLoader (扩展ClassLoader)
App ClassLoader (应用ClassLoader/系统ClassLoader)
Custom ClassLoader(自定义ClassLoader)
每个ClassLoader都有一个Parent作为父亲
JDK中ClassLoader默认设计模式 – 协同工作
rt.jar /-Xbootclasspath
%JAVA_HOME%/lib/ext/*.jar
Classpath下
完全自定义路径
JDK中ClassLoader默认设计模式 – 协同工作
JDK中ClassLoader默认设计模式
public class HelloLoader {
public void print(){
System.out.println(I am in apploader);
}
}
public class FindClassOrder {
public static void main(String args[]){
HelloLoader loader=new HelloLoader();
loader.print();
}
}
public class HelloLoader {
public void print(){
System.
文档评论(0)