java第二单元pot,pot Java 虚拟机总结给面试的你(中)

ee989947482426ff8a446941ecc35db3.png

本篇博客主要针对虚拟机的类加载机制,虚拟机字节码执行引擎,早期编译优化进行总结,其余部分总结请点击Java虚拟总结上篇 。

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

在初始化时,若待初始化的类有父类则其父类先进行初始化(接口除外),并且先初始化包含main的主类。需要注意的是子类引用父类非final静态变量时,只初始化静态变量所在类,即父类,而引用final类型static变量不会引起任何初始化,因为其编译期间就已经储存在常量池中了。另外数组定义也是不会引发类的初始化。比如

通过类的全限定名来获取定义此类的二进制字节流,将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构,在内存中生成一个代表类的数据访问入口的java.lang.Class对象。

·字节码验证:确保程序语义是合法的,符合逻辑的。如类型转换,跳转指令等。

虚拟机将常量池内的符号引用转换为直接引用的过程。符号引用用一组符号来描述所引用的目标。而直接引用是直接指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。

在初始化阶段真正开始执行Java程序代码(字节码),执行类的构造器()方法,()方法是由编译器自动收集所有类变量的赋值动作和静态语句块的语句合并而成,同一类中的静态块与类变量按顺序初始化,在同一个加载器下,一个类只会被初始化一次。

907f0b0f7e361daf4414ed8369812f16.png

扩展类加载器,负责加载\lib\ext目录或java.ext.dirs系统变量指定的路径中的所有类库。

应用程序类加载器,负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。

双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机栈的栈元素。pot它储存了方法的局部变量表,操作数栈,动态链接,方法返回地址,对于活动线程来说,只有栈顶的栈帧才是有效的,称为当前栈帧,与其关联的方法叫做当前方法。

局部变量表存放方法参数和方法内部定义的变量。单位是slot(槽),最大可以达到32位。垃圾回收时,slot可以复用,将不使用的变量置为null是有意义的,方便垃圾回收。局部变量不像类变量,是没有初始值的。

当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为 “Hot Spot Code”(热点代码),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,完成这项任务的正是 JIT 编译器。

方法在编译时并不确定方法的真实地址,而是一个符号引用,使得Java的动态扩展能力提升,在类加载过程甚至运行时才确定目标方法的直接引用。

61cHw4wcy5L._SL1500_.jpg

在类的解析阶段将一部分符号引用转换为直接引用,这部分符号引用代表的方法必须“编译期可知,运行时不变”,如静态方法,私有方法,实例构造器,父类方法。final方法也是。

静态分派(与重载相关),依赖静态类型来定位方法执行版本的分派动作。自动转型顺序:char->int->long->float->double->Character->Serializable->Object->char...

动态分派(重写相关),找到操作数栈顶的第一个元素所指向的对象的实际类型,若常量池中的描述符和简单名称都相符,则返回直接引用,否则对其父类进行第二步。

在类的方法区建立一个虚方法表提升效率,若子类未重写父类的方法,则子类的继承方法中地址和父类方法的地址是一样的,若重写了父类的方法,则子类的方法地址就会改变,指向自己实现的版本。如上图Son的clone方法没有被重写,指向的是Object父类的地址,而hardChoice方法被重写了,指向的是Son自己实现的地址。

类型检查的主题过程在运行期而不是在编译期,如,Javascript,,PHP,与之相对的就是静态语言。

语法分析是根据Token序列构造抽象语法树的过程。抽象语法树是用来描述程序代码语法结构的树形表示方法,每一个节点都代表着程序代码的一个语法结构:包,类型,修饰符等。

·泛型与类型擦除:与C#不一样,Java的泛型是伪泛型,在生成的字节码中已经被替换成了原生类型了,会自动加上类型转换。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/bofangqi/article-88640-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值