聊聊Java的字节码
本文为作者原创,转载请注明出处(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的字节码的更多相关文章
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- java虚拟机字节码执行引擎
定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码 ...
- java class 字节码
java class 字节码 协议: class文件 魔数(Magic):4byte -> 0xCAFEBABE 类似2f3f 版本(Version):4Byte -> 0x0000003 ...
- 小师妹学JVM之:java的字节码byte code简介
目录 简介 Byte Code的作用 查看Byte Code字节码 java Byte Code是怎么工作的 总结 简介 Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译 ...
- 使用java动态字节码技术简单实现arthas的trace功能。
参考资料 ASM 系列详细教程 编译时,找不到asm依赖 用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具. 不管是线上还是线下,我们都可以用Arthas ...
- JAVA的字节码技术
1.什么是字节码? 字节码 byteCode JVM能够解释执行的.java程序的归宿,但是从规范上来讲和Java已没有任何关系了.一些动态语言也可以编译成字节码在JVM上运行.字节码就相当于JVM上 ...
- Java虚拟机--字节码指令集
1. 字节码指令集简介: Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指 ...
- Java Class 字节码文件结构详解
Class字节码中有两种数据类型: 字节数据直接量:这是基本的数据类型.共细分为u1.u2.u4.u8四种,分别代表连续的1个字节.2个字节.4个字节.8个字节组成的整体数据. 表:表是由多个基本数据 ...
- Java 动态字节码技术
对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些 ...
随机推荐
- python之并发编程之多进程
一.共享数据 进程间通信应该尽量避免使用本节所讲的共享数据方式 from multiprocessing import Manager,Process,Lock def work(dic,mutex) ...
- 小甲鱼:Python学习笔记003_函数
>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") ...
- Kafka水位(high watermark)与leader epoch的讨论
~~~这是一篇有点长的文章,希望不会令你昏昏欲睡~~~ 本文主要讨论0.11版本之前Kafka的副本备份机制的设计问题以及0.11是如何解决的.简单来说,0.11之前副本备份机制主要依赖水位(或水印) ...
- cocos2dx 播放gif
起因 或许有人会说,cocos2dx中直接帧动画就行了用什么GIF. 起因是为游戏内部要用到第三方平台的头像,而第三方平台的头像大多都是用到Gif,所以才会有了这个需求 过程 查了各种文档都没找到.但 ...
- Maven(五)之Maven配置阿里云镜像飞快下jar包
用过Maven的人都知道Maven对于依赖的管理让我们程序员从此远离了自己去在项目中把需要的jar包导入到项目中,但是因为中央仓库是在国外的,所以在我们从中央仓库下载依赖的时候, 我们发现下载速度真的 ...
- 说下browserslist
browserslist 是一个开源项目 见到有些package.json里会有如下的配置参数 "browserslist": [ "> 1%", &qu ...
- 【Linux笔记(001) 】-- centos7 系统目录结构与文件
一.目录结构与用途: /boot:系统引导文件.内核 /bin:用户的基本命令 /dev:设备文件 /etc:配置文件 /home:用户目录 /root:root用户目录 /sbin:管理类的基本命令 ...
- Webx项目的获取与验证
在JavaWeb环境配置后就可进行Webx实例项目的获取与研读了. 1.创建一个初始的Demo工程. 1)下载 Webx Maven 项目的目录结构Artifact插件. archetype-webx ...
- FPGA与Deep Learning
你还没听过FPGA?那你一定是好久没有更新自己在IT领域的知识了. FPGA全称现场可编程门阵列(Field-Programmable Gate Array),最初作为专用集成电路领域中的一种半定制电 ...
- 我从.net转别的语言的遭遇,现在貌似又要回头(一)
从2016年开始,作为公司最后的一个.net部门,被迫转向了php. php里面装得一手什么逼呢? 首先,你要来几本入门的书,linux,mysql,php基础语法,nginx或apache.哥那时候 ...