首页 > 其他分享 >jvm 字节码

jvm 字节码

时间:2023-04-14 10:15:08浏览次数:30  
标签:文件 0000 0001 0100 jvm class 字节

编译

  • 前端编译:依靠 jdk 的编译工具把 java 文件编译成 class 文件,javac 命令
  • 后端编译:class 文件编译成机器指令
    • 逐行读取 class 文件内同,并解释成机器指令
    • 引入 jit 技术提高解释效率,比如某些类中共有的内容,这些内容解释次数过多就直接缓存起来
  • 反编译:把 class 文件反编译为汇编代码
    • 依靠的是 jdk 的 javap 命令
    • 比如分析 synchronized 锁的时候,从汇编代码能看到 monitorentermonitorexit 指令

字节码文件长啥样

public class Main {
    private int m;
    public int inc() {
        return m + 1;
    }
}

javac 之后生成的字节码文件如下

cafe babe 0000 0034 0013 0a00 0400 0f09
0003 0010 0700 1107 0012 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 0369 6e63
0100 0328 2949 0100 0a53 6f75 7263 6546
696c 6501 0009 4d61 696e 2e6a 6176 610c
0007 0008 0c00 0500 0601 0010 636f 6d2f
7268 7974 686d 372f 4d61 696e 0100 106a
6176 612f 6c61 6e67 2f4f 626a 6563 7400
2100 0300 0400 0000 0100 0200 0500 0600
0000 0200 0100 0700 0800 0100 0900 0000
1d00 0100 0100 0000 052a b700 01b1 0000
0001 000a 0000 0006 0001 0000 0003 0001
000b 000c 0001 0009 0000 001f 0002 0001
0000 0007 2ab4 0002 0460 ac00 0000 0100
0a00 0000 0600 0100 0000 0800 0100 0d00
0000 0200 0e

字节码文件内容

是根据 java 文件生成来的,所以里面的内容和 java 文件肯定是一致的,只不过有归纳终结的意味在里面

  • 常量池 Constant pool
    • 本字符串,final常量
    • 类和接口的全限定名
    • 字段的名称和描述符号
    • 方法的名称和描述符
  • 方法表(方法的具体类容)
    • stack: 最大操作数栈,JVM运行时会根据这个值来分配栈帧(Frame)中的操作栈深度
    • 参数个数、局部变量、方法体 等等

标签:文件,0000,0001,0100,jvm,class,字节
From: https://www.cnblogs.com/hangychn/p/17317406.html

相关文章

  • jvm 初识
    总结jvm是一套规范,只要实现了相关规定就可以视为是一个jvm,jdk的是hotSpot,不同jdk版本的jvm也有细微差异jvm不仅可以作为java的运行环境,还能作为别的语言的运行环境,比如kotlin、groovy等java能跨平台是因为不同平台都有对应的jvm,jvm能把同样的java文件生成......
  • 使用java.util.zip对生成的字节数组输出文件流 进行打包压缩(单个、批量),并返回压缩包
    废话不多说直接上代码 packagegov.test.util;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.util.List;importjava.util.Map;importorg.apache.tools.zip.ZipEntry;importorg.apache.tools.zip.Zip......
  • jvm
    1.什么情况下会发生栈内存溢出。  2.详解JVM内存模型思路:给面试官画一下JVM内存模型图,并描述每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。我的答案:JVM内存结构   3.JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。4.JVM......
  • JVM:内存结构上
    !点击代码高亮化!jvm内存结构·上程序计数器虚拟机栈(线程私有栈-方法的栈帧\FILO)当前线程的压入的方法的栈帧-Xss"SIZE":设置线程栈大小栈内存溢出SO:StackOverflowErrorat'错误代码处'递归调用有时第三方库也会导致SO:ObjectMapper/@JsonIgnore线程安全方法的......
  • jvm
    java内存模型与分区:本地方法栈:native方法调用本地其他语言接口;程序计数器:记录当前线程的运行位置;栈:存放运行时的方法,包括:局部变量表、操作数栈、动态链接(指向常量池)和方法返回地址。堆:初始化的对象、成员变量。方法区:类型信息(加载类的类型(Class)、类的完整名称、类型修饰符等......
  • JVM 内存
    简述JVM内存模型  从宏观上来说JVM内存区域分为三部分线程共享区域、线程私有区域、直接内存区域。1.1、线程共享区域1.1.1、堆区堆区Heap是JVM中最大的一块内存区域,基本上所有的对象实例都是在堆上分配空间。堆区细分为年轻代和老年代,其中年轻代又分为Eden、S0、S1......
  • 细读JVM日志--01
    七种垃圾收集器具体每一种的详情见以下是垃圾回收日志中的一块:0.150:[GC(System.gc())[PSYoungGen:5161K->931K(74752K)]5161K->939K(245760K),0.0007762secs] [Times:user=0.00sys=0.00,real=0.00secs]0.151:[FullGC(System.gc())[PSYoungGen:931K->0K(74752K)]......
  • 比特和字节
    1、比特比特是计算机中最小的信息量单位,一个比特有且只有0和1两个值。2、字节字节是计算机中常用的信息量单位,一个字节由8个连续的比特组成。在计算机中存储、表示、计算和传输等任务,都是以字节作为基本单位进行的。3、其他信息量单位1字节(Byte)=8位(bit)1KB(Kilobyte,千......
  • 辨析字、字长、字节、位的概念
    位(Bit):表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。字节(Byte):一个字节由8个位组成。字(Word):cpu一次操作能处理的数据长度。字长:字的位数叫做字长。字长的长度是不固定的,对于不同的CPU、字长的长度也不一样。8位的CPU一次只能处理一个字节,而32位的CPU一次就能......
  • nop指令多字节占位
    在动态调试过程中,有时候要给一个地址进行nop.(nop代表无意义指令,可以被cpu执行.执行之后不会影响寄存器,堆栈,以及寄存器)nop的机器码是0x90而在后面的调试器中,针对nop指令又作了"升级"以前想要nop五个字节.那就要写五个字节.现在有种新的方式(通过逆向的来.发现的多了......