本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃

巴山楚水凄凉地,二十三年弃置身。
怀旧空吟闻笛赋,到乡翻似烂柯人。
沉舟侧畔千帆过,病树前头万木春。
今日听君歌一曲,暂凭杯酒长精神。

一、什么是Java字节码?

借用Algorithm(4th)节选:它是程序的一种低级表示,可以运行于Java虚拟机上。将程序抽象成字节码可以保证Java程序在各种设备上的运行。OK,这个回答可以让我们回到程序执行上来看下一个问题:

二、程序是怎么执行的?

学习过计算机的同学都应该深恶痛绝一门课程——编译原理,这门课程的主要目的就是向你解释你所见所写的代码的执行过程。我们通常使用的C++、Java、python等等都属于高级计算机语言,但是计算机只能够理解“0”和“1”也就是二进制机器码,所以高级程序语言要在机器上执行需要把自己翻译成二级制机器码,这个翻译的过程主要是由编译器来完成的,例如C++程序编译后在Windows平台可以形成.exe的可执行文件,而在Unix或者Linux平台则会编译形成.dll文件,不同平台的C++编译器是不同的。

三、Java程序是怎么执行的?

Java要复杂一些,因为Java具有跨平台特性,为了实现这个特性Java执行在一台虚拟机上,这台虚拟机也就是JVM,Java通过JVM屏蔽了不同平台之间的差异,从而做到一次编译到处执行。JVM位于Java编译器和OS平台之间,Java编译器只需面向JVM,生成JVM能理解的代码,这个代码即字节码,JVM再将字节码翻译成真实机器所能理解的二进制机器码。

四、字节码是怎么产生的?

我们所编写的程序都是.java格式,通常在执行的时候也许点击一下eclipse的运行键就可以在控制台看到运行结果,但是也可以更酷一些,如果你装了JDK,那就可以直接在以命令行的方式编译运行你的.java文件,编译后会形成.class文件,这个.class文件即字节码。

例如:可以用文本新建一个HelloWorld.java文件:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello Java");
}
}

打开命令行进入文件目录,输入编译命令:javac HelloWorld.java

若程序没有错误,在当前目录下就会生成同名的HelloWorld.class文件。此时在命令行中输入java HelloWorld就可以看到程序执行结果: Hello Java

为了验证它的跨平台特性,我们把.class拿到Windows平台验证一下:

结果是相同的。

java的命令行功能是很丰富的,不再一一赘述,当然聪明人还是会用一个好的IDE。

五、字节码怎么解读?

字节码长什么样子呢?打开.class文件看看:

这就是上面那段HelloWorld的字节码,的确是以字节形式呈现出来的。四不四看起来头晕,四不四除了开头的cafebabe其他都不认识,其实还好啦,你只要知道字节码就是用字节对应关键字,比如开头的cafebabe对应的就是文件编码格式,对应表示.class文件的魔数,后面的0034表示版本号。

为什么要这样呢?我们再回到第二个问题:程序是怎么执行的,机器能够理解的就是二进制机器码,可是我们编译器在翻译的时候不能直接搞成“0”和“1”啊,不然这么多编程语言,这么多编译器,会死人滴,学过计算机基础的都应该熟悉这样一张图(图片源自百度百科):

是的,高级语言转为机器语言还有一层汇编语言,这是一种符号语言,上手简单,编写困难,通常被应用在底层,硬件驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言,也就是说高级语言的编译器并不是直接将代码转成二进制的,二是转成汇编语言,再通过汇编指令转成机器码。回到Java,字节码其实和汇编语言之间是有对应关系的,当然,字节码要更丰富一些。

关于字节码的解读,不是一两句话能说清楚的,改天再填坑,如果真的有兴趣,可以去看一本书《深入浅出JVM》,有几个解读的传送门如下:

http://blog.csdn.net/dc_726/article/details/7944154/

http://www.importnew.com/13107.html

六、解读字节码有什么意义?

可以让你明白程序的执行原理,方便在理解后优化代码,当然,还能干坏事。。。

聊聊Java的字节码的更多相关文章

  1. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  2. java虚拟机字节码执行引擎

    定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码 ...

  3. java class 字节码

    java class 字节码 协议: class文件 魔数(Magic):4byte -> 0xCAFEBABE 类似2f3f 版本(Version):4Byte -> 0x0000003 ...

  4. 小师妹学JVM之:java的字节码byte code简介

    目录 简介 Byte Code的作用 查看Byte Code字节码 java Byte Code是怎么工作的 总结 简介 Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译 ...

  5. 使用java动态字节码技术简单实现arthas的trace功能。

    参考资料 ASM 系列详细教程 编译时,找不到asm依赖 用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具. 不管是线上还是线下,我们都可以用Arthas ...

  6. JAVA的字节码技术

    1.什么是字节码? 字节码 byteCode JVM能够解释执行的.java程序的归宿,但是从规范上来讲和Java已没有任何关系了.一些动态语言也可以编译成字节码在JVM上运行.字节码就相当于JVM上 ...

  7. Java虚拟机--字节码指令集

    1. 字节码指令集简介: Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指 ...

  8. Java Class 字节码文件结构详解

    Class字节码中有两种数据类型: 字节数据直接量:这是基本的数据类型.共细分为u1.u2.u4.u8四种,分别代表连续的1个字节.2个字节.4个字节.8个字节组成的整体数据. 表:表是由多个基本数据 ...

  9. Java 动态字节码技术

    对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些 ...

随机推荐

  1. csv模块简单使用

    json是一种嵌套了列表与字典的格式,json包可以读取返回的json格式,json.load(html返回的对象) csv模块,用来操作csv文件, import csv #from os impo ...

  2. 关于Linux的loop设备

    偶然发现/dev目录里有几个loop设备,一番搜索得知,这是一种伪设备(pseudo-device),它可以把一个文件连接为设备(就像Windows下用虚拟光驱挂载ISO文件). 遂做实验验证: 1. ...

  3. 14.LINUX-platform机制实现驱动层分离(详解)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本节目标:        学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分 ...

  4. SpringMVC HelloWorld实例开发及部署

    SpringMVC HelloWorld实例开发及部署 2017-01-24 目录 1 Tomcat及Eclipse Tomcat插件安装配置  1.1 Tomcat的安装  1.2 Eclipse ...

  5. Spring 级联属性

    Spring 级联属性是当两个bean 关联时  从一个bean 给 另一个bean 赋值 Application xml  配置如下 <bean id="ZhangSan" ...

  6. Chrome控制台选择器简介

    Chrome的控制台是支持用$来获取元素的,这点可能是很多人不知道的.本篇文章将会简单介绍怎样更好的来使用这种快捷方式来获取元素. 判断当前窗口的$是来自谁的 我们知道jQ里面经常使用$来进行元素选择 ...

  7. Redis学习——Redis持久化之RDB备份方式保存数据

    从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...

  8. 怎样使用自定义标签简化 js、css 引入?

    国庆将至,工作兴致全无,来总结点项目里平时不起眼干货. 前端引入 js .css 一般是这样: <script type="text/javascript" src=&quo ...

  9. Liers 树状数组+中国剩余定理

    Liers Time Limit: 14000/7000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus ...

  10. Python格式化字符串--format

    format格式化字符串方法相较于老版%格式方法的优点: 1.不需要理会数据类型的问题,在%方法中'%s'只能替代字符串类型. 2.单个参数可以多次输出,参数顺序可以不相同. 3.填充方式十分灵活,对 ...