查看“深入理解JVM:虚拟机类加载机制”的源代码
←
深入理解JVM:虚拟机类加载机制
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:JVM]] == 概述 == Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 * '''运行时加载''':类型的加载、连接和初始化过程都是在程序运行期间完成的; == 类加载的时机 == 类的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading); [[File:类的生命周期.jpg|600px]] * 其中验证、准备、解析三个部分统称为连接(Linking)。 * 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序开始: ** 只按序“开始”,而不一定按序“进行”或“完成”:这些阶段通常都是互相交叉地混合进行的,会在一个阶段执行的过程中调用、激活另一个阶段; ** 而解析阶段则不一定:在某些情况下,解析可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚期绑定); 加载的时机:“《Java虚拟机规范》中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。” 但是对于初始化阶段,《Java虚拟机规范》则是严格规定了'''有且只有'''六种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始): # 遇到“new”、“getstatic”、“putstatic”或“invokestatic”这四条字节码指令时,如果类型没有进行过初始化,则需要先触发其初始化阶段。能够生成这四条指令的典型Java代码场景有: #* 使用'''new'''关键字实例化对象的时候。 #* 读取或设置一个类型的'''静态字段'''(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候。 #* 调用一个类型的'''静态方法'''的时候。 # 使用“java.lang.reflect”包的方法对类型进行'''反射调用'''的时候,如果类型没有进行过初始化,则需要先触发其初始化。 # 当初始化类的时候,如果发现其父类还没有进行过初始化,则需要先触发其'''父类的初始化'''。 # 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先'''初始化主类'''。 # 当使用JDK 7新加入的动态语言支持时,如果一个“java.lang.invoke.MethodHandle”实例最后的解析结果为“REF_getStatic”、“REF_putStatic”、“REF_invokeStatic”、“REF_newInvokeSpecial”四种类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。【???】 # 当一个接口中定义了JDK 8新加入的'''默认方法'''(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。 除此之外,所有引用类型的方式都不会触发初始化,称为“'''被动引用'''”。 == 类加载的过程 == === 加载 === === 验证 === === 准备 === === 解析 === === 初始化 === == 类加载器 == === 类与类加载器 === === 双亲委派模型 === === 破坏双亲委派模型 === == Java模块化系统 == === 模块的兼容性 === === 模块化下的类加载器 ===
返回至“
深入理解JVM:虚拟机类加载机制
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息