java虚拟机
2021-04-08 13:25
标签:code app eth 处理 部分 版本 变量 计算 als 打算从静态代码开始说起。重点还是后面动态的过程 从问题出发,为什么可以实现“一次编写,到处运行”? 答案:平台/语言无关的字节码编译结果(.class文件)+虚拟机 首先,西红柿炒鸡蛋的一生? 1. 看菜谱,把需要的食材放到一起(加载) 2. 看下食材有没有坏掉的?锅洗了没?盐、酱油是否有?(验证) 3. 把鸡蛋洗一下,西红柿也要洗一下切块,鸡蛋则可以打一下,完成最基本的备菜(准备) 4. 开始打蛋调味,西红柿呢,就进行切块(解析) 5. 先炒鸡蛋,再炒西红柿(初始化) 6. 吃饭 7. 光盘行动~~ 获取一个类的二进制字节流,最终生成一个Class对象 在方法区生成一个java.lang.Class对象,作为程序访问方法区中的这些类型数据的外部接口 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器” JNDI:本身由启动类加载器加载,但是它需要去加载其他的资源,这些资源是用户定义的,无法被启动类加载器认识 程序动态性:代码热替换(HotSwap)、模块热部署(HotDeployment) (OSGi)....这个还要再补充 目的:确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全 从外往里看,可以看到有以下几个部分 是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理 只有通过这个验证,才能进入方法区存储 如这个类是否有父类、字段是否与父类冲突、是否实现所有抽象方法等 发生在虚拟机将符号引用转化为直接引用的过程 验证是否能找到引用对象,字段等是否可访问 目的:为类(static)变量分配内存并设置类初始值 非final变量:0、false、null final变量:程序中设置的值 目的:将常量池内的符号引用替换为直接引用 符号引用:个人觉得可以看成是占位符 直接引用:通过直接引用可以找到引用对象的内存位置。可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄 初始化阶段是执行类构造器 1. 《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》 java虚拟机 标签:code app eth 处理 部分 版本 变量 计算 als 原文地址:https://www.cnblogs.com/coolqiyu/p/13340802.html一、开始
四、Java对象的一生
1. 加载
2. 连接——验证
3. 连接——准备
4. 连接——解析
5. 初始化
参考资料