第一次学习看字节码文件,这个对工作没什么用,但是会提升内功。

首先介绍两个IDEA插件以及使用:

  1. BinEd:以16进制格式查看class文件

    使用方法:右键class文件,点击Open as binary
  2. JClassLib:以一种更为方便的方式查看字节码,相当于javap -v HelloWorld.class

    使用方法:光标锁定在java源文件-->选IDEA上方菜单-->Show Bytecode With Jclasslib

分析如下java代码的字节码文件

package com.study.jvm;

public class T0100_ByteCode01 {
}

然后我们贴16进制文件进来,下方文件是基于编译器javac 1.8.0_45版本得到。(使用javac -version查看自己编译器版本)

CAFE BABE

第一个16进制数C,换算成十进制是12,换算成二进制是1100,一个C等于1100,是4位,一个字节占8位。所以一个CA代表一个字节。

然后就是一个字节一个字节的去看十六进制的规则了:

具体看的规则非常之枯燥,需要参考资料。

想看懂字节码还离不开指令集(如:aload_,bipush),这一些就是java的汇编。JVM执行的就是这些一个一个的指令。

指令集请参考官方JVM规范文档第6.5章【指令集与其含义】和第7章【opcode和指令的映射关系】。

助记符是指:因为JAVA里面的一条指令是用一个字节来表示的,所以从0X00到0Xff一共256个数字,其中每个数字都代表一条指令。

如:0x03代表的是指令iconst_0,iconst_0是助记符,0X03是真正的指令。他们是相等的。

其他园友的一篇很详细的字节码结构分析

https://www.cnblogs.com/chanshuyi/p/jvm_serial_05_jvm_bytecode_analysis.html

官方虚拟机规范和JAVA语言规范

我们可以在Oracle官网https://docs.oracle.com/javase/specs/index.html获取到任何版本的虚拟机规范和JAVA语言规范。里面全是一手资料,也是最最最最权威的文档。

参考资料:

1.官方JVM规范文档:https://docs.oracle.com/javase/specs/index.html

2.官方JVM8规范文档:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

3.《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》--周志明

4.马士兵老师课程内容

【Java虚拟机1】Java字节码文件格式入门的更多相关文章

  1. java虚拟机(十四)--字节码指令

    字节码指令其实是很重要的,在之前学习String等内容,深入到字节码层面很容易找到答案,而不是只是在网上寻找答案,还有可能是错误的. PS:本文基于jdk1.8 首先写个简单的类: public cl ...

  2. 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常

    概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...

  3. JVM总结-虚拟机怎么执行字节码

    1. JRE,JDK JRE : 包含运行 Java 程序的必需组件,Java 虚拟机+ Java 核心类库等. JDK :  JRE + 一系列开发.诊断工具. 2. java字节码 编译器将 Ja ...

  4. Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  5. 深入理解java:1.2. 字节码执行引擎

    执行引擎是Java虚拟机的核心组成部分之一. 首先,想想C++和Java在编译和运行时到底有啥不一样? 下图左边,C++发布的就是机器指令, 而下图右边Java发布的是字节码,字节码在运行时通过JVM ...

  6. 深入理解java虚拟机【Java Class类文件结构】

    Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码 ...

  7. 深入理解 Java 虚拟机——走近 Java

    1.1 - 概述 Java 总述:Java 不仅是一门编程语言,还是一个由一系列 计算机软件 和 规范 形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...

  8. JAVA虚拟机体系结构JAVA虚拟机的生命周期

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...

  9. Java虚拟机三 Java堆和栈

    Java堆是和Java应用程序关系最为紧密的内存空间,几乎所有的对象都存放在堆中.并且堆是完全自动化管理的. 根据垃圾回收机制的不同,Java堆有可能有不同的结构.最为常见的一种就是将整个Java堆分 ...

随机推荐

  1. Appium问题解决方案(7)- Could not find 'adb.exe' in PATH. Please set the ANDROID_HOME environment variable with the Android SDK root directory path

    背景:运行代码提示找不到ADB An unknown server-side error occurred while processing the command. Original error: ...

  2. ubuntu安装glusterFS

    以2台服务器为例: node1: 172.18.1.10 node2: 172.18.1.20 1) 修改主机名,修改hosts文件添加IP地址映射 hostname node1/node2vim / ...

  3. 将给定数据源生成静态HTML页面持久化到项目之外的硬盘

    一.java代码 设置好数据源map Map<String,String> map=new HashMap<>(); map.put("knowledgeName&q ...

  4. session案例之验证码

    一.需求分析 其中,一张图片就是一个单独的请求: 一个验证验证码的Servlet,还有一个验证用户名和密码的Servlet,两次都可能有错误信息返回到前端页面,所以前面页面要从request域中获取返 ...

  5. 一键配置tomcat定期日志清理功能

    概述 日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到.对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题.除此之外,处理一个单个的 ...

  6. R和Rstudio的安装

    首先是安装R再安装Rstudio 链接放在这里: R语言软件以及Rstudio软件下载:链接:https://pan.baidu.com/s/11TH4mJjoi3QXGfamB697rw 密码:o1 ...

  7. 一起搞懂PHP的错误和异常(一)

    在PHP的学习过程中,我们会接触到两个概念,一个是错误,一个是异常.啥玩意?他们不是一个东西嘛?如果接触过Java.C#之类的纯面向对象语言的同学,可能对异常是没有什么问题,毕竟所有的问题都可以try ...

  8. ecshop二次开发秒杀、限时折扣、清仓等功能

    限时抢购,秒杀商品的二次开发 1,先在后台admin/templates 中找goods_info.htm文件到促销部分,改为一个下拉列表的分别是促销,限时,秒杀,值分别是1,2,3这样,代码如下: ...

  9. ecshop调用指定广告的方法

    在include/lib_goods.php文件下面新增:function getads($cat,$num){ $time = gmtime();$sql = "SELECT * FROM ...

  10. Docker系列(11)- 部署Nginx

    step-1 搜索镜像 使用search命令,建议去dockerhub上搜索,可以看到帮助文档 [root@localhost ~]# docker search nginx NAME DESCRIP ...