Java代码的运行

为什么Java代码需要在虚拟机中运行

  • Java 代码作为一种高级语言直接在硬件中执行是不现实的,所以在代码运行前需要进行转换。Java虚拟机通过编译器将Java代码进行转换为虚拟机可识别的指令序列(Java字节码)。
  • 虚拟机可以由硬件来实现,但通常是由软件来实现。由软件实现的有各种平台的虚拟机(Windows,Mac等),由虚拟机转换后的Java字节码文件,即可在不同平台实现的虚拟机中运行。
  • 虚拟机还带来的另一个好处就是有一个托管环境,使程序员更主要关心业务代码。例如自动内存管理和垃圾回收。

Java虚拟机怎样运行字节码

分两个视角:

  • 虚拟机视角:执行Java代码需要先编译成class文件,然后将其加载到虚拟机中。加载后的Java类会放在方法区中,实际运行时,虚拟机会执行方法区中的代码。
    在运行过程中,每当调用进入一个方法,虚拟机就会在当前线程的方法栈中生成一个栈桢,用来存放局部变量和字节码的操作数。这个栈桢是提前计算好的,并且在内存中不需要连续。
  • 硬件视角:Java字节码是无法直接运行的,需要虚拟机将字节码翻译为机器可识别的机器码。这个翻译的过程有两种形式:解释执行:逐条将字节码翻译为机器码并执行 和 即时编译(JIT):将一个方法中包含的所有字节码翻译为机器码后再执行。
    • 前者的优势在于无需等待编译,后者的优势在于实际运行速度更快。HotSpot采用混合模式,先解释执行字节码,然后将需要反复执行的热点代码,进行以方法为单位进行即时编译。

Java虚拟机的运行效率

根据二八定律,其实大部分的代码是不需要提前编译的,是可以直接解释执行的。仅需将少部分的热点代码进行编译,达到提升效率。
为了满足不同客户的需求,HotSpot内置了多个即时编译器:C1、C2 和 Graal。在编译时间和生成代码的执行效率之间进行取舍。

  • C1编译器又叫Client编译器,主要面向对启动时间有要求的GUI用户。
  • C2编译器又叫Server编译器,主要面向对峰值性能有要求的服务端。编译时间长但是生成的代码执行效率高。
  • Java7以后采用分层编译,优先被C1编译,而后被C2编译,并根据CPU的数量设置编程线程的数量,按照1:2比例分配给C1,C2。

再回顾一下Java内存区域划分

Java虚拟机运行时将内存划分为5个部分:方法区、堆、PC寄存器、Java方法栈和本地方法栈

对于热点代码的判断可看链接

JVM会统计每个方法被调用了多少次,超过多少次,那就是热点方法。(还有个循环回边计数器,用来编译热循环的。) 默认的分层编译应该是达到两千调C1,达到一万五调C2。
https://mp.weixin.qq.com/s/GO2fAeGgaB2jIC02gWp5Aw
分享一个工具 asmtools 可以修改字节码指令文件
https://ci.adoptopenjdk.net/view/Dependencies/job/asmtools/lastSuccessfulBuild/

public class Foo {
    public static void main(String[] args) {
        boolean flag = true;
        if(flag){
            System.out.println("Hello,Java");
        }
        if(flag==true){
            System.out.println("Hello,JVM");
        }
    }
}
super public class Foo
        version 52:0
{
  public Method "<init>":"()V"
        stack 1 locals 1
  {
                aload_0;
                invokespecial   Method java/lang/Object."<init>":"()V";
                return;
  }
  public static Method main:"([Ljava/lang/String;)V"
        stack 2 locals 2
  {
                iconst_1;  //@1 用asmtools 工具将此处修改为 iconst_2 那么程序输出结果为 Hello,Java。
                istore_1;
                iload_1;
                ifeq    L14;
                getstatic       Field java/lang/System.out:"Ljava/io/PrintStream;";
                ldc     String "Hello,Java";
                invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        L14:    stack_frame_type append;
                locals_map int;
                iload_1;
                iconst_1;
                if_icmpne       L27;
                getstatic       Field java/lang/System.out:"Ljava/io/PrintStream;";
                ldc     String "Hello,JVM";
                invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        L27:    stack_frame_type same;
                return;
  }

} // end Class Foo

jvm把boolean当做int来处理
flag = iconst_1 = true
修改后flag改为iconst_2
if(flag)比较时ifeq指令做是否为零判断,常数2仍为true,打印输出
if(true == flag)比较时if_cmpne做整数比较,iconst_1是否等于flag,比较失败,不再打印输出。
-- 这个来自极客时间中的评论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353