面试回答第十五问:类加载
类加载简介类加载是JVM能够识别类信息分配空间创建对象实例的基础。类加载一共分为五阶段分别是加载验证准备解析初始化五阶段。这不是顺序不是加载之后才能验证验证之后才能准备。下面我会提到具体执行顺序。加载首先加载阶段就是我们写一个.java文件被编译成.class二进制字节码文件之后转换成JVM规定的运行时数据结构Klass模板类信息全都在Klass中之后创建对象实例就是依靠Klass指示分配多大内存啊有什么静态变量等等。验证验证阶段有四个验证分别是字节码验证文件格式验证元数据验证以及符号验证。像字节码验证这个是在加载阶段之前做的保证字节码是安全的其次文件格式和元数据是针对加载阶段得到的Klass做的验证Klass文件格式以及它存储的元数据的安全最后的符号验证是在解析阶段之前做的验证符号是否有对应的直接地址比如方法内引用的类是否已被加载比如Test类的main方法中执行new User那么针对Test类加载中的符号验证就是要验证User类是否已被类加载没有就先加载User类。准备准备阶段就是把类的静态变量全部赋默认值比如static int赋0引用赋null赋值赋的是类型默认值。解析解析阶段就是把符号引用转成直接引用比如main方法内要执行一行new User方法这个User在没解析之前就是一个符号解析就是把这个符号映射到User类的Klass地址这就是直接引用直接引用User类的Klass这样执行时就可根据Klass创建实例对象至于符号引用与直接引用的映射这个放到了常量池中常量池也是方法区的一部分我多介绍一点我想把JVM的方法区介绍的透彻一点方法区是以Klass为单位存储类元数据那Klass中也是有划分的比如类的字段类的继承信息类的方法常量池等等其中类的每个方法都有一个Method对象里面存储方法的字节码。比如main方法的第二行代码new User编译成字节码后变成new #2这个#2就是User类在Test类的main方法的代号在没做解析之前这就是一个普通的代号在解析之后#2这个代号指向User类的Klass地址这个映射在常量池中当main方法执行时就从常量池中取出映射找到User的Klass指导JVM分配堆内存。初始化初始化阶段就是为类中的静态变量赋指定初始值。至此类加载结束
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2465981.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!