简述
我们要运行java程序,必须保证jvm已经加载类所需的类。这个过程是怎样的呢
类的生命周期
包括了装载,连接(包括验证、准备和解析)和初始化
加载
将二进制字节码读入jvm。包括以下阶段:
1.通过类的全限定名获得定义此类的二进制数据流
2.将字节流转化为方法区的内部数据结构
3.在jvm堆中生成java.lang.Class实例,成为java程序与内部数据结构之间的接口
怎么生成二进制流?有很多种方式,例如本地文件系统加载,网络下载,jar提取,动态编译等。类加载器不需要等到某个类型初次时候才装载,可以预先加载,但是等到使用时,如果装载出现问题,才报错。
验证
是为了保证Class文件字节流包含的信息符号jvm的要求,不会危害jvm运行的安全
包括几个方面:
1.文件格式验证。例如magic number,版本号 和 常量池数据合法性等
2.元数据验证。就是验证是否符合java语言规范。例如是否继承了final类等
3.字节码验证。涉及到指令的细节了。包括类型检查,跳转指令
4.引用符号的验证。验证通过符号能否找到相关的信息
准备
jvm为类变量分配内存,设置默认的初始值(例如int 的默认初始值0)。假如有个类变量 int a = 1;在准备阶段,它的值是0.只有到了初始化阶段,它才真正被赋值1.而 static final int a = 1;又比较特殊,jvm在ConstantValue找到了它的值,所以就直接赋值为1
解析
这个步骤是可选的。只有符号引用被程序首次使用时才进行。解析过程就是将符号引用转为直接引用的过程。包括类、接口、字段和方法的解析
初始化
什么时候要初始化?
1.遇到new、 getstatic、putstatic或invokestatic四条指令。通俗一点讲,就是new一个对象、读取静态字段、设置静态字段(final的特殊,在准备阶段已经完成)或者调用某个类的静态方法。
2.其他特殊的创建对象方式(反射、克隆或者发序列化)
3.初始化子类,发现父类还没有被初始化,此事会先初始化父类
4.jvm启动时,用户指定要执行的主类(main函数所在的类)
初始化过程,就是给成员变量赋值的过程。类变量的初始化,和static语句块的执行都是在()函数中进行的。这个函数是jvm自动生成的,程序无法直接调用。我们看class文件的字节码就可以找到它。它里面代码的执行顺序是根据赋值语句在代码中出现的顺序依次执行。所以,static语句块只能访问它前面定义的变量。父类的()肯定在子类的()之前执行。接下来就执行构造函数了。
参考资料
1.深入java虚拟机
2.深入理解java虚拟机
分享到:
相关推荐
对jvm内存模型&垃圾收集算法&类加载机制进行了整理,读者可以作为参考进行学习和探讨,,
JVM学习笔记核心知识点整理,包含类文件加载机制,运行时数据,JVM内存模型,GC算法,垃圾收集器分类等
第一章(类的加载机制) 1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的...
类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、可移植、高性能和安全性等特点,因此被广泛应用...
思维导图 主要包括:jvm学习笔记,包含示例,JIT,类加载机制,垃圾回收机制等等,站在全局的角度思考问题
类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 健壮 3.面向对象 面向过程: 程序:函数+变量 (算法+数据结构) 面向对象: 如:SmallTalk 程序:对象和对象相互之间的“通讯” ...
类加载机制/过程 双亲委派机制/沙箱安全机制 JMM(Java内存模式) 字节码执行的过程/机制 GC(垃圾回收算法) JVM性能监控和故障定位 JVM调优 JavaWeb servlet request response cookie && session 基础框架 SpringMVC ...
类加载机制 新生代频繁 gc 如何调整 CMS 垃圾回收器 锁 Lock 与 Sychronized 区别 Redis 分布式锁 Zookeeper 分布式锁 死锁产生原因 如何解决死锁 数据库死锁例子 JAVA 并发 AQS 源码 ReentrantLock 源码 Condition ...
通过带着读者从java基础到java编写spring全家桶框架面试以及技术讲解,例如:集合,数组,JVM,引用类型,IO/NIO,多线程,类加载机制,spring设计原理等内容实现。 适合人群:具备一定编程基础,工作3-5年的研发...
动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...
动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...
百度地图开发java源码 MD-Notes:后端笔记总结 关于 MD-Notes: 业余时间学习技术的同时,做一些记录和总结并乐于分享。 日常主要接触 Web 前后端开发、Linux ...:类加载过程,双亲委派机制 :syncro
Java虚拟机相关,内存模型,类加载机制,JVM性能解析等 零散的文章 数据结构与算法 算法的度量,基础数据结构,链表,二叉树,B树,图论,深度和广度优先算法,排序,查找等 设计模式 常用设计模式的Java语言描述 ...