zoukankan      html  css  js  c++  java
  • 【Java虚拟机1】Java字节码文件格式入门

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

    首先介绍两个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.马士兵老师课程内容

  • 相关阅读:
    websocket 初识
    JavaScript 系列博客(四)
    JavaScript 系列博客(三)
    JavaScript 系列博客(二)
    JavaScript 系列博客(一)
    前端(八)之形变
    前端(七)之动画与阴影
    java变量、数据类型
    js简单的获取与输出
    Eclipse字体修改
  • 原文地址:https://www.cnblogs.com/1626ace/p/13284256.html
Copyright © 2011-2022 走看看