[inside hotspot] 汇编模板解释器(Template Interpreter)和字节码执行 1.模板解释器 hotspot解释器模块(hotspot\src\share\vm\interpreter)有两个实现:基于C++的解释器和基于汇编的模板解释器.hotspot默认使用比较快的模板解释器. 其中 C++解释器 = bytecodeInterpreter* + cppInterpreter* 模板解释器 = templateTable* + templateInterprete…
虽然说解释执行模式是逐字逐句翻译给目标平台运行的,但这样的过程未免太过缓慢,如果能把字节码说的话做成纸条,运行时只要把对应的纸条交给目标平台就可以了,这样,执行速度就会明显提升.JVM的Hotspot虚拟机的模板解释器就是用这种方法来解释执行的.在开始分析之前,先了解一下JVM的执行方式. (1).边解释边运行,即每次解释一条字节码并运行其解释的本地代码,这种执行引擎速度相对很慢  (2).JIT(即时编译)具有更快的运行速度但是需要更多的内存,方法被第一次调用时,字节码编译生成的本地代码将会被…
1.源代码(source code) 源代码就是平时我们开发的代码:比如C.Java.Python.Shell...等 public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); } } 2.汇编代码(Assembly code) 汇编语言也是人看的懂的语言,也是源码 #hello.s .data # 数据段声明 msg : .string &…
本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Architecture),也可以称为指令集(instruction set).Intel将x86系列CPU之中的32位CPU指令集架构称为IA-32,IA是"Intel Architecture"的简称,也可以称为i386.x86-32.AMD等于Intell提出了x86系列的64位扩展,所以由AM…
hotspot的启动流程与main方法调用 虚拟机的使命就是执行public static void main(String[])方法,从虚拟机创建到main方法执行会经过一系列流程.这篇文章详细讨论了执行命令行java.exe HelloWorld调用main函数输出经历了什么.源码使用openjdk12,操作系统为windows 64bits,其它系统和源码版本大同小异. java.base 首先要明白一个概念,java.exe大体上可以分为启动器部分和hotspot部分. 启动器负责执行一…
1. 简介 这篇文章可以说是Christian Wimmer硕士论文Linear Scan Register Allocation for the Java HotSpot™ Client Compiler的不完整翻译,这篇论文详细论述了HotSpot JIT编译器的架构,然后描述了C1编译器(研究用,细节和Sun的Client编译器生产级实现有些许出入)中线性扫描寄存器分配算法的设计和实现. C1编译器内部使用HIR,LIR做为中间表示并进行系列优化和寄存器分配.字节码到HIR的构造是最先完成…
0. 简介 众所周知,hotspot默认使用解释+编译混合(-Xmixed)的方式执行代码.它首先使用模板解释器对字节码进行解释,当发现一段代码是热点的时候,就使用C1/C2 JIT进行优化编译再执行,这也它的名字"热点"(hotspot)的由来. 解释器的代码位于hotspot/share/interpreter,它的总体架构如下: 1. 解释器的两种实现 首先hotspot有一个C++字节码解释器,还有一个模板解释器 ,默认使用的是模板解释器的实现.这两个有什么区别呢?举个例子,J…
1.背景 上文探讨了:[JVM]模板解释器--如何根据字节码生成汇编码? 本篇,我们来关注下字节码的resolve过程. 2.问题及准备工作 上文虽然探讨了字节码到汇编码的过程,但是: mov %rax,%(rcx,rbx,1) // 0x89 0x04 0x19 其中为什么要指定0x04和0x19呢? 搬出我们的代码: public int swap2(CallBy a,CallBy b) { int t = a.value; a.value = b.value; b.value = t; r…
1. 方法调用模块入口 Java所有的方法调用都会经过JavaCalls模块.该模块又细分为call_virtual调用虚函数,call_static调用静态函数等.虚函数调用会根据对象类型进行方法决议,所以需要获取对象引用再查找实际要调用的方法:而静态方法调用直接查找要调用的方法即可.不管怎样,这些方法都是先找到要调用的方法methodHandle,然后传给JavaCalls::call_helper()做实际的调用. 2. 寻找调用方法 现在我们知道了methodHandle表示实际要调用的…
[Inside HotSpot] Java分代堆 1. 宇宙初始化 JVM在启动的时候会初始化各种结构,比如模板解释器,类加载器,当然也包括这篇文章的主题,Java堆.在hotspot源码结构中gc/shared表示所有GC共同拥有的信息,gc/g1,gc/cms则是不同实现需要用到的特设信息. λ tree ├─gc │ ├─cms │ ├─epsilon │ ├─g1 │ ├─parallel │ ├─serial │ ├─shared │ └─z 比如所有的Java堆都继承自Collect…