深入理解Java虚拟机
文章平均质量分 70
成年老猿
国内TOP10学校研究生毕业
8+年大厂经验
很高兴在这里和大家进行技术交流
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【14】即时编译器的中间表达形式
更确切的说,是一张包含控制流和数据流的 IR 图,每个字节码对应其中的若干个节点(注意,有些字节码并没有对应的 IR 节点)。我们可以将每一种优化看成一个独立的图算法,它接收一个 IR 图,并输出经过转换后的 IR 图。HotSpot里的C2采用的是名为 Sea-of-nodes的SSA IR。它最大的特点是去除了变量的概念,直接采用变量所指向的值来进行运算。JIT不需要重新进行词法、语法、语义分析,而是直接将Java字节码当做IR。这种IR的特点是每个变量只能被赋值一次,且只有在被赋值以后才能使用。原创 2024-08-21 22:39:33 · 425 阅读 · 0 评论 -
【13】即时编译(JIT)
当方法被 3 层 C1 所编译时,生成的 C1 代码将收集条件跳转指令的分支 profile,以及类型相关指令的类型 profile。在假设失败的情况下,Java 虚拟机将采取去优化,退回至解释执行并重新收集相关的 profile。当方法的调用次数和循环回边的次数的和超过-XX:CompileThreshold,便会触发JIT(使用C1时,该值为1500,使用C2时,该值为10000)代码会先在JVM上解释执行,之后反复执行的热点代码会被即时翻译成为机器码,直接运行在底层硬件上。阈值大小是动态调整的。原创 2024-08-18 23:24:08 · 850 阅读 · 0 评论 -
【10】Java内存模型
如果操作X happens-before 操作Y,那么X的结果对于Y可见。没有标记为volatile,在同一线程中,A1和A2存在happens-before关系,但没有数据依赖,因此可以重排序。对于即时编译器来说,会针对每个happens-before关系,向正在编译的目标方法中插入相应的内存屏障。在同一个线程中,字节码的先后顺序(program order)也暗含了happens-before关系。操作X happens-before 操作Y,使得操作X之前的字节码结果对操作Y之后的字节码可见。原创 2024-08-18 21:39:24 · 671 阅读 · 0 评论 -
【8】Java对象的内存布局
构造函数的调用:构造函数的调用要做为构造器的低一条语句,目的是初始化继承而来的父类字段。原创 2024-08-17 16:55:53 · 368 阅读 · 0 评论 -
【07】JVM是怎么实现invokedynamic的
invokedynamic 是 Java 7 引入的一条新指令,用以支持动态语言的方法调用。具体来说,它将调用点(CallSite)抽象成一个 Java 类,并且将原本由 Java 虚拟机控制的方法调用以及方法链接暴露给了应用程序。在运行过程中,每一条 invokedynamic 指令将捆绑一个调用点,并且会调用该调用点所链接的方法句柄。原创 2024-08-10 21:47:46 · 923 阅读 · 0 评论 -
【06】JVM是如何实现反射的?
为了保证框架的可扩展性,往往借助 Java 的反射机制,根据配置文件来加载不同的类。Spring 框架的依赖反转(IoC),便是依赖于反射机制。原创 2024-08-10 21:43:29 · 481 阅读 · 0 评论 -
【05】JVM是如何处理异常的
这个操作会逐一访问当前线程的栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常等信息。当程序触发异常时,Java虚拟机会遍历异常表中的所有条目。当触发异常的字节码的索引值在异常条目的监控范围内,JVM会判断所抛出的异常和该条目想要捕获的异常是否匹配。这个事情是由编译器来实现的,现在的做法是这样的,编译器在编译Java代码时,会复制finally代码块的内容,然后分别放在try-catch代码块所有的正常执行路径及异常执行路径的出口中。原创 2024-08-03 23:38:14 · 543 阅读 · 0 评论 -
【04】JVM是如何执行方法调用的
方法表中有两个特点:1.子类方法表中包含父类方法表中的所有方法 2.子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。内联缓存,缓存虚方法调用中调用者的动态类型,以及该类型所对应的目标方法。Java虚拟机中的静态绑定指的是在解析时能够直接识别目标方法的情况,动态绑定指的是在运行过程中根据调用者的动态类型来识别目标方法的情况。2.invokespecial:用于调用私有实例方法、构造器以及使用super关键字调用父类的实例方法或构造器,和所实现接口的默认方法。举个例子说明下上面这句话。原创 2024-08-03 23:36:29 · 611 阅读 · 0 评论 -
【03】Java虚拟机是如何加载Java类的
从class文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三个步骤。原创 2024-07-27 23:39:52 · 707 阅读 · 0 评论 -
【02】Java的语言类型
Java语言的类型可以分为两大类:基本类型和引用类型。原创 2024-07-27 23:36:07 · 321 阅读 · 0 评论 -
【01】Java代码如何运行
JRE: 包含Java虚拟机以及核心类库JDK: 同样包含了JRE,并且附带了一系列开发、诊断工具。原创 2024-06-29 11:38:33 · 483 阅读 · 0 评论
分享