聊聊Java的字节码

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

一、什么是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

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

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

时间: 2024-10-04 15:58:28

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

Tomcat部署Web应用方面的一些问题(多Tomcat、指定Java、字节码替换)

这篇博文操作的系统环境为CentOS系统,目标是在该系统中部署一个Tomcat以及跑在该Tomcat上的一个Java Web应用.部署的系统环境有限制,主要表现在:该主机上已部署Tomcat,新部署的Tomcat应不影响原Tomcat及相应应用的访问:此外,系统上已安装某一版本的Java,已设置JAVA_HOME等环境变量,而当前应用依赖另一版本的Java, 因此需要在不影响原应用.环境变量配置的基础上解决依赖问题. Tomcat安装 安装前需准备好Java环境,配置好JAVA_HOME环境变量

JAVA的字节码技术

1.什么是字节码? 字节码 byteCode JVM能够解释执行的.java程序的归宿,但是从规范上来讲和Java已没有任何关系了.一些动态语言也可以编译成字节码在JVM上运行.字节码就相当于JVM上的汇编语言. 2.字节码的一些特点标准JVM使用的堆栈:有些虚拟机使用寄存器.例如安卓虚拟机.标准JVM使用一个字节的指令.理论上256个指令,目前已经使用了200+. 3.字节码的用途 a.静态检查 b.调试/热切换/诊断工具 c.在JVM上的新语言 d.AOP.ORM e.Mock 尤其是Fau

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

字节码指令集简介: Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指令并不包含操作数,只有一个操作码. do { 自动计算PC寄存器以及从PC寄存器的位置取出操作码; if (存在操作数) 取出操作数; 执行操作码所定义的操作 } while (处理下一次循环)

java的字节码bytecode

字节码名字的由来 字节码以一个字节即8bit为最小单位储存:字节码是java程序编译后的结果:字节码是一组8位字节为基础单位的二进制流 Java从源文件到执行的过程. 如何阅读JAVA字节码 原文地址:https://www.cnblogs.com/shengulong/p/11711423.html

java从字节码角度解析案例(转)

本文来自于参考博客 1. 下面是一到Java笔试题: 1 public class Test2 2 { 3 public void add(Byte b) 4 { 5 b = b++; 6 } 7 public void test() 8 { 9 Byte a = 127; 10 Byte b = 127; 11 add(++a); 12 System.out.print(a + " "); 13 add(b); 14 System.out.print(b + ""

Java虚拟机-字节码执行引擎

概述 Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,成为各种虚拟机执行引擎的统一外观(Facade).不同的虚拟机引擎会包含两种执行模式,解释执行和编译执行. 运行时帧栈结构 栈帧(Stack Frame)支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量.操作数栈.动态连接和方法返回地址等信息.方法调用开始到执行完成,对应这一个帧栈在虚拟机栈里面入栈和出栈的过程. 一个线程中

java虚拟机5 字节码

java字节码本质是java程序的格式化表示,便于机器处理.所以他是java程序的另一种表示,java程序包含的信息他都包含并且更加结构化. java虚拟机字节码格式: magic 魔数,标识该文件是一个字节码文件. minor_version major_version 字节码的版本号 constant_pool 常量池,存储字节码中的常量数据以及符号引用.常量数据包括有utf8.Integer.float.long.double几种类型.符号引用包括有class.field.method 因

这一次,彻底弄懂「Java字节码文件」

提前祝福各位读者??圣诞快乐!这个圣诞节请在学习中度过! 不啰嗦,直接从最最简单的一段Java源代码开启Java整体字节码分析之旅. 1.Java 源码文件 package com.dskj.jvm.bytecode; public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; } } 2.Java字节码文件 IDEA工具编译代码后,

虚拟机字节码执行引擎

在前面的几篇文章里,从Java虚拟机内存结构开始,经历了虚拟机垃圾收集机制.Class类文件结构到后来的虚拟机类加载机制,一步步的进入到了Java虚拟机即Java底层的世界.在有了前面的基础之后,接下来就应该进入Java虚拟机最重要的部分了--虚拟机字节码执行引擎,毕竟,这是Java程序得以在不同机器上运行的核心部分. Java是通过实现Java虚拟机来达到平台无关的."虚拟机"的概念是相对于"物理机"来说的,两种机器都有执行代码的能力,不过物理机是直接面向处理器.