专栏首页Java后端技术栈cwnait面试官:什么是字节码?它最大的优势是什么?

面试官:什么是字节码?它最大的优势是什么?

什么是字节码?

这个问题,面试官可以衍生提问,Java 是编译执行的语言,还是解释执行的语言。

Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。

编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。

随便找一个项目汇总的.class文件,然后使用16进制的方法查看:

0000000: cafe babe 0000 0034 0061 0a00 1600 4709  .......4.a....G.
0000010: 0005 0048 0900 0500 4909 0005 004a 0700  ...H....I....J..
0000020: 4b0a 0005 004c 0a00 0500 4d0a 0016 004e  K....L....M....N
0000030: 0a00 0500 4f0a 0005 0050 0a00 1600 5107  ....O....P....Q.
0000040: 0052 0a00 0c00 4708 0053 0a00 0c00 540a  .R....G..S....T.
0000050: 000c 0055 0800 5608 0057 0a00 0c00 5808  ...U..V..W....X.
0000060: 0059 0a00 0c00 5a07 005b 0700 5c01 0005  .Y....Z..[..\...
0000070: 7461 6749 6401 0013 4c6a 6176 612f 6c61  tagId...Ljava/la
0000080: 6e67 2f49 6e74 6567 6572 3b01 0007 7461  ng/Integer;...ta
0000090: 674e 616d 6501 0012 4c6a 6176 612f 6c61  gName...Ljava/la
00000a0: 6e67 2f53 7472 696e 673b 0100 0574 6f74  ng/String;...tot
00000b0: 616c 0100 0149 0100 063c 696e 6974 3e01  al...I...<init>.
00000c0: 0003 2829 5601 0004 436f 6465 0100 0f4c  ..()V...Code...L00000d0: 696e 654e 756d 6265 7254 6162 6c65 0100  ineNumberTable..
00000e0: 124c 6f63 616c 5661 7269 6162 6c65 5461  .LocalVariableTa
00000f0: 626c 6501 0004 7468 6973 0100 1f4c 636f  ble...this...Lco
0000100: 6d2f 6a61 7661 2f74 6961 6e2f 626c 6f67  m/java/tian/blog
0000110: 2f65 6e74 6974 792f 5461 673b 0100 0867  /entity/Tag;...g
0000120: 6574 5461 6749 6401 0015 2829 4c6a 6176  etTagId...()Ljav
0000130: 612f 6c61 6e67 2f49 6e74 6567 6572 3b01  a/lang/Integer;.0000140: 000a 6765 7454 6167 4e61 6d65 0100 1428  ..getTagName...(0000150: 294c 6a61 7661 2f6c 616e 672f 5374 7269  )Ljava/lang/Stri0000160: 6e67 3b01 0008 6765 7454 6f74 616c 0100  ng;...getTotal..0000170: 0328 2949 0100 0873 6574 5461 6749 6401  .()I...setTagId.0000180: 0016 284c 6a61 7661 2f6c 616e 672f 496e  ..(Ljava/lang/In
0000190: 7465 6765 723b 2956 0100 104d 6574 686f  teger;)V...Metho
00001a0: 6450 6172 616d 6574 6572 7301 000a 7365  dParameters...se
00001b0: 7454 6167 4e61 6d65 0100 1528 4c6a 6176  tTagName...(Ljav00001c0: 612f 6c61 6e67 2f53 7472 696e 673b 2956  a/lang/String;)V
00001d0: 0100 0873 6574 546f 7461 6c01 0004 2849  ...setTotal...(I
00001e0: 2956 0100 0665 7175 616c 7301 0015 284c  )V...equals...(L00001f0: 6a61 7661 2f6c 616e 672f 4f62 6a65 6374  java/lang/Object
0000200: 3b29 5a01 0001 6f01 0012 4c6a 6176 612f  ;)Z...o...Ljava/
0000210: 6c61 6e67 2f4f 626a 6563 743b 0100 056f  lang/Object;...o
0000220: 7468 6572 0100 0a74 6869 7324 7461 6749  ther...this$tagI
0000230: 6401 000b 6f74 6865 7224 7461 6749 6401  d...other$tagId.
0000240: 000c 7468 6973 2474 6167 4e61 6d65 0100  ..this$tagName..
0000250: 0d6f 7468 6572 2474 6167 4e61 6d65 0100  .other$tagName..
0000260: 0d53 7461 636b 4d61 7054 6162 6c65 0700  .StackMapTable..
0000270: 4b07 005b 0100 0863 616e 4571 7561 6c01  K..[...canEqual.
0000280: 0008 6861 7368 436f 6465 0100 0550 5249  ..hashCode...PRI
0000290: 4d45 0100 0672 6573 756c 7401 0006 2474  ME...result...$t
00002a0: 6167 4964 0100 0824 7461 674e 616d 6501  agId...$tagName.
00002b0: 0008 746f 5374 7269 6e67 0100 0a53 6f75  ..toString...Sou
00002c0: 7263 6546 696c 6501 0008 5461 672e 6a61  rceFile...Tag.ja
00002d0: 7661 0c00 1e00 1f0c 0018 0019 0c00 1a00  va..............
00002e0: 1b0c 001c 001d 0100 1d63 6f6d 2f6a 6176  .........com/jav
00002f0: 612f 7469 616e 2f62 6c6f 672f 656e 7469  a/tian/blog/enti
0000300: 7479 2f54 6167 0c00 3e00 330c 0025 0026  ty/Tag..>.3..%.&
0000310: 0c00 3200 330c 0027 0028 0c00 2900 2a0c  ..2.3..'.(..).*.
0000320: 003f 002a 0100 176a 6176 612f 6c61 6e67  .?.*...java/lang
0000330: 2f53 7472 696e 6742 7569 6c64 6572 0100  /StringBuilder..
0000340: 0a54 6167 2874 6167 4964 3d0c 005d 005e  .Tag(tagId=..].^
0000350: 0c00 5d00 5f01 000a 2c20 7461 674e 616d  ..]._..., tagNam
0000360: 653d 0100 082c 2074 6f74 616c 3d0c 005d  e=..., total=..]
25 lines filtered                                                

查看方式是先使用vim将.class文件打开,然后输入:%!xxd然后就可以看到cafe babe开头的字节码了。

另外一种方式查看字节码的方式:xxd Tag.class Tag.txt和上面一样。

二进制与16进制转换还有其他一些方式,如下:

以十六进制格式输出: od [选项] 文件 od -d 文件 十进制输出 -o 文件 八进制输出 -x 文件 十六进制输出 xxd 文件 输出十六进制 在vi命令状态下: :%!xxd :%!od 将当前文本转化为16进制格式 :%!xxd -c 12 每行显示12个字节 :%!xxd -r 将当前文本转化回文本格式

上面的字节码看起来是不是很无语,很多人是对其很厌烦。其实也没那么难的。

每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java 源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。这也就是解释了 Java 的编译与解释并存的特点

Java 源代码
=> 编译器 => JVM 可执行的 Java 字节码(即虚拟指令)
=> JVM => JVM 中解释器 => 机器可执行的二进制机器码 => 程序运行
采用字节码的好处?

Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

解释型语言:解释型语言,是在运行的时候将程序翻译成机器语言。解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低。——百度百科 例如:Python、PHP 。

本文分享自微信公众号 - Java后端技术全栈(jjs-2018),作者:田老师

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅析按值传递与按引用传递

    下列关于按值传递与按引用传递的描述中,正确的是( )。A.按值传递不会改变实际参数的数值 B.按引用传递能改变实际参数的参考地址C.按引用传递能改变实际参数的内...

    用户4143945
  • 可能是目前最详细的Redis内存模型及应用解读

    Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。

    用户4143945
  • RabbitMQ和Kafka到底怎么选?

    开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kaf...

    用户4143945
  • CSS简介与语法

    白胡杨同学
  • 九年前,AI还未成风口,创业公司也没几家

    1978年,文革刚刚结束,改革开放正在酝酿,清华大学便在计算机系内部成立“人工智能与智能控制”教研组。

    啦啦啦
  • 通俗易懂讲解WebSocket

    什么是WebSocket WebSocket是一种网络协议,在OSI模型中,WebSocket协议与HTTP协议一样,都属于最顶层的应用层协议。有些朋友可能会有...

    黄泽杰
  • 一文读懂WebSocket

    WebSocket是一种网络协议,在OSI模型中,WebSocket协议与HTTP协议一样,都属于最顶层的应用层协议。有些朋友可能会有疑问,既然已经有了HTTP...

    黄泽杰
  • HTML5 & CSS3初学者指南(2) – 样式化第一个网页

    介绍 我们已经使用基本的 HTML 编写了一个网页。但是,写出来的 HTML 代码的网页看起来很平淡,没有吸引力。 ? 如何改善这种很平淡的页面呢? 让我们开始...

    葡萄城控件
  • WebSocket 浅析

    前言 在WebSocket API尚未被众多浏览器实现和发布的时期,开发者在开发需要接收来自服务器的实时通知应用程序时,不得不求助于一些“hacks”来模拟实时...

    腾讯Bugly
  • WebSocket协议入门介绍

    WebSocket是基于TCP的应用层协议,用于在C/S架构的应用中实现双向通信,关于WebSocket协议的详细规范和定义参见rfc6455。 需要特别注意...

    2Simple

扫码关注云+社区

领取腾讯云代金券