Java@深入理解Java虚拟机:类加载机制
文章图片
文章图片
虚拟机把描述类的数据从Class文件加载到内存 , 并对数据进行校验 , 解析和初始化 , 最终形成可以被虚拟机直接使用的Java类型 。
一、类的生命周期
二、类加载时机必须对类进行\"初始化\"的情况:
- 使用new关键字实例化对象的时候
- 读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候 。
- 调用一个类型的静态方法的时候
- 使用java.lang.reflect包的方法对类型进行反射调用的时候 。
- 当初始化类的时候 , 发现其父类还没有进行过初始化的时候 。
- 当虚拟机启动时 , 用户需要制定一个要执行的主类(包含main()方法的那个类) , 虚拟机会先初始化这个主类 。
- 如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄 , 并且这个方法句柄对应的类没有进行过初始化的时候
- 被default关键字修饰的接口方法 , 如果这个接口的实现类发生了初始化的时候 。
加载阶段需要完成的事
- 通过一个类的全限定名来获取定义此类的二进制字节流 。
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 。
- 在内存中生成一个代表这个类的java.lang.Class对象 , 作为方法区这个类的各种数据的访问入口 。
- 从ZIP压缩包中读取 , JAR、EAR、WAR 。
- 从网络中获取 , Web Applet 。
- 动态代理
- 由其他文件生成 , JSP文件生成对应的Class文件 。
- 从数据库中读取 , SAP Netweaver可以选择把程序安装到数据库中完成程序代码在集群间的分发 。
- 可以从加密文件中获取 , 防Class文件被反编译的保护措施 , 通过加载时解密Class文件来保障程序运行逻辑不被窥探 。
四个阶段的验证动作:
- 文件格式验证 , 包括魔数、主次版本、常量池常量类型 , 访问标识等等
- 元数据验证 , 包括是否有父类、是否继承了不允许被继承的类 , 非抽象类是否实现了父类或接口中要求实现的方法等等
- 字节码验证 , 通过数据流分析和控制流分析 , 确定程序语义是合法的、符合逻辑的 。
- 符号引用验证 , 对类自身以外的各类信息进行匹配性校验(该类是否缺少或者禁止访问它依赖的某些外部类、方法、字段等资源)
- 木星:地球没事吧?太阳系最强烈暴风雨出现,却被要求深入探测
- Java@23种java设计模式之:建造者模式、工厂方法模式、抽象工厂模式!
- Java@深入理解Java虚拟机:高效并发之Java内存模型
- IT之家▲《后浪》策划团队回应刷屏:并不会反对一些不同的理解
- 【UFO】叹为观止,美方正式公布3段UFO视频,目击者:已经无法用常理解释
- UFO@美方正式公布3段UFO视频,目击者:已经无法用常理解释
- 「航天」人类寿命可达1000年,剩下的900年被谁拿走了?专家给出合理解释
- 「海报新闻客户端」优质鲁货深入对接电商平台“牵手”阿里、京东等扩大线上销售
- 『科学家』蚂蚁并非是二维生物,科学家发现多维度空间,人类一直理解错了
- 手机大魔王@深入分析华为Nova7,这款手机到底值不值?