Reference


字节码 核心概念

Class文件是8位字节流,按字节对齐。之所以称为字节码,是由于每条指令都仅仅占领一个字节。全部的操作码和操作数都是按字节对齐的。

数据结构

Java虚拟机规范中规定。Class文件格式採用一种相似C语言结构体的伪结构来存储,它仅仅有两种数据类型

无符号数(基本数据类型)

主要用于描写叙述数字、索引引用、数量值、或UTF-8编码构成的字符串;

u1 – 1个字节

u2 – 2个字节

u4 – 4个字节

u8 – 8个字节

表(复合数据类型)

用于描写叙述有层次关系的复合结构的数据。

习惯性以“_info”结尾

Class文件格式

数据类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count + 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attributes_count 1
attribute_info attributes attributes_count

class说明

  • magic: Class文件的头4个字节,它的唯一作用是用于确认该文件是否是能被JVM接受的Class文件
  • minor_version :第5和第6字节是次版本号号
  • major_version:第7和第8字节是主版本号号

  • constant_pool_count: 常量池大小

  • cp_info : 复合数据结构,是一组常量数据结构,有11种常量数据结构

  • access_flags :訪问标志,access_flags的计算公式为:access_flags = flagA | flagB | flagB …

  • field_info :字段表(field_info)用于描写叙述类或接口中声明的变量,它包括类变量、实例变量,但不包括方法内的局部变量和块变量。和cp_info部分不一样。cp_info由于常量类型的不一样其数据结构有11种,但field_info的结构仅仅有一种。

    (数据结构例如以下)



    字段訪问标志。和类的訪问标志,由于修饰符不同稍有不同,具体见下图。

  • method_info:方法表集合(method_info)和字段表集合的结构是一致的,仅仅是訪问标志不同。

  • attribute_info:用于在Class文件、字段表、方法表中携带自己的属性表集合,以用于描写叙述某些场景的专有信息。



    Java程序方法体里面的代码经过javac编译器处理过后将终于字节码存储在Code属性内。抽象类或接口中的方法不存在Code属性。

  • SourceFile:SourceFile属性主要记录生成这个Class文件的源码名称,也属于可选属性,能够使用javac的-g:none或-g:source选项来关闭或要求生成这些信息。

  • LocalVariableTable:LocalVariableTable属性用于描写叙述栈帧中局部变量表中的变量与Java源码定义的变量之间的关系,可是这样的关系并不是执行时必须,默认也不会生成到Class文件里,能够通过javac中使用-g:none或-g:vars选项取消或者生成这项信息。

  • LineNumberTable:LineNumberTable属性用于描写叙述Java源码行号和字节码行号(字节码的偏移量)之间的相应关系,它不是执行时必须属性。但默认会生成到Class文件里。

    也能够在javac中使用-g:none或-g:lines选项来取消或显示生成这一部分信息。

具体參见 Java字节码.class文件案例分析


jvm执行浅谈

Java虚拟机(JVM)是基于栈结构的。对于最初的main方法产生的全部的方法调用,都会在栈中产生一个帧。这些帧各自包括一组局部变量,这组局部变量就是这种方法在执行过程中所需的全部变量,包括一个指向this的引用、该方法的全部參数以及其它局部定义的变量。对于类方法(即static方法),其參数列表从0開始算起。而对于实例方法。位置0是用来存储this引用。

class执行就是jvm顺序执行一条条保存在Code中的指令,例如以下所看到的:

动态过程,例如以下:

public class Demo {
public static void foo() {
int a = 1;
int b = 2;
int c = (a + b) * 5;
}
}

具体參见

- 深入理解java字节码

- 从Java代码到字节码


javap 反汇编

javap是JDK自带的反汇编器。能够查看java编译器为我们生成的字节码。通过它,我们能够对比源码和字节码。从而了解非常多编译器内部的工作。

语法:

  javap [ 命令选项 ] class…

  javap 命令用于解析类文件。其输出取决于所用的选项。

若没有使用选项。javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。

命令选项

  -help 输出 javap 的帮助信息。

  -l 输出行及局部变量表。

  -public 仅仅显示 public 类及成员。

  -protected 仅仅显示 protected 和 public 类及成员。

  -package 仅仅显示包、protected 和 public 类及成员。这是缺省设置。

  -private 显示全部类和成员。

  -s 输出内部类型签名。

  -c 输出类中各方法的未解析的代码。即构成 Java 字节码的指令。

  -verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本号

  -classpath[路径] 指定 javap 用来查找类的路径。假设设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。文件夹用冒号分隔。

  -bootclasspath[路径] 指定载入自举类所用的路径。

缺省情况下,自举类是实现核心 Java 平台的类。位于 jrelib以下。

  -extdirs[dirs] 覆盖搜索安装方式扩展的位置。

扩展的缺省位置是 jrelibext。

Java字节码 小结的更多相关文章

  1. 从零写一个编译器(十一):代码生成之Java字节码基础

    项目的完整代码在 C2j-Compiler 前言 第十一篇,终于要进入代码生成部分了,但是但是在此之前,因为我们要做的是C语言到字节码的编译,所以自然要了解一些字节码,但是由于C语言比较简单,所以只需 ...

  2. 在Eclipse里查看Java字节码

    要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...

  3. JAVA字节码解析

    Java字节码指令 Java 字节码指令及javap 使用说明 ### java字节码指令列表 字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送 ...

  4. 【转】在Eclipse里查看Java字节码

    要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...

  5. Java字节码(.class文件)格式详解(一)

    原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...

  6. 通过Java字节码发现有趣的内幕之String篇(上)(转)

    原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...

  7. 掌握Java字节码(转)

    Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就 ...

  8. Java字节码操纵框架ASM小试

    本文主要内容: ASM是什么 JVM指令 Java字节码文件 ASM编程模型 ASM示例 参考资料汇总 JVM详细指令 ASM是什么 ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既 ...

  9. Java:从面试题“i++和++i哪个效率高?"开始学习java字节码

    今天看到一道面试题,i++和++i的效率谁高谁低. 面试题的答案是++i要高一点. 我在网上搜了一圈儿,发现很多回答也都是同一个结论. 如果早个几年,我也会认同这个看法,但现在我负责任的说,这个结论是 ...

随机推荐

  1. 绝对定位后,position:absolute;不能使用margin: 0 auto;实现居中;

    声明: web小白的笔记,欢迎大神指点!联系QQ:1522025433. 我们都知道margin: 0 auto:可也实现块状元素的水平居中:但是对于绝对顶为的元素就会失效: 请看实例: <!d ...

  2. python + slenium自动化测试设置元素等待

    WebDriver 提供了两种类型的等待:显式等待和隐式等待. 显式等待 显式等待使 WebdDriver 等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常 (TimeoutExcepti ...

  3. myEclipse开发内存溢出解决办法myEclipse调整jvm内存大小java.lang.OutOfMemoryError: PermGen space及其解决方法

    摘要: tomcat部署多个项目后,启动tomcat正常,访问项目时却会出现该错误在网上查了查又试了好几次,才解决,将解决方法记录下来,以方便以后查看或让遇到同样问题的朋友有个参考 PermGen s ...

  4. MVCJSONJQuery分页实现

    思路: 1.用Ado.NET获取数据 2.控制器中创建一个方法参数为搜索条件 3.返回前台一个Json对象,把对象用一个类封装 4.用JQuery接收数据 public ActionResult In ...

  5. JQuery+Ajax实战三级下拉列表联动(八)

    本片文章为练习,项目中不会这样写: 一:涉及到的知识点: jQuery Dom操作 jQuery Ajax操作 ASP.net中的json操作 二:用了自动代码生成器 1.Dal层的代码: publi ...

  6. JS高级 - 面向对象2(prototype定义)

    定义和用法 prototype 属性允许您向对象添加属性和方法 注意: Prototype 是全局属性,适用于所有的Javascript对象. 语法 object.prototype.name=val ...

  7. poj 3461 (模式串T在主串S中出现的次数)

    求模式串在主串中出现的次数Sample Input 3BAPCBAPCAZAAZAZAZAVERDIAVERDXIVYERDIANSample Output 130 #include <iost ...

  8. Codeforces 744C Hongcow Buys a Deck of Cards 状压dp (看题解)

    Hongcow Buys a Deck of Cards 啊啊啊, 为什么我连这种垃圾dp都写不出来.. 不是应该10分钟就该秒掉的题吗.. 从dp想到暴力然后gg, 没有想到把省下的红色开成一维. ...

  9. mysql数据库备份 mysqldump

    一.--all-databases /application/mysql3307/bin/mysqldump -uroot -S /application/mysql3307/logs/mysql.s ...

  10. 002 在大数据中基础的llinux基本命令

    一:基本命令 1.显示当前的目录 2.长格式显示目录自身的信息 3.创建文件 4.创建目录 创建多层目录,使用-p. 5.删除目录或者文件 -f:不提示,强制删除 -i:删除前,提示 -r:删除目录以 ...