美文网首页
jvm字节码指令分析

jvm字节码指令分析

作者: kevinfuture | 来源:发表于2018-12-22 11:23 被阅读0次

java类:

public class TestModel {
    private Integer test = 1215201269;
    private Integer test1 = 90;
    private String stringTest = "haizeiwang";
    private Long aLongTest = 90890890L;
    private Float aFloatTest = 9099f;
    private String stringtest2 = "huoyingrenzhe";
    
}

这里我仅对<init>方法分析,也就是非静态的构造函数!
使用javap -verbose TestModel.class指令查看字节码指令:

public com.bj58.nodetest.contract.TestModel();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: ldc           #2                  // int 1215201269
         7: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        10: putfield      #4                  // Field test:Ljava/lang/Integer;
        13: aload_0
        14: bipush        90
        16: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        19: putfield      #5                  // Field test1:Ljava/lang/Integer;
        22: aload_0
        23: ldc           #6                  // String haizeiwang
        25: putfield      #7                  // Field stringTest:Ljava/lang/String;
        28: aload_0
        29: ldc2_w        #8                  // long 90890890l
        32: invokestatic  #10                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
        35: putfield      #11                 // Field aLongTest:Ljava/lang/Long;
        38: aload_0
        39: ldc           #12                 // float 9099.0f
        41: invokestatic  #13                 // Method java/lang/Float.valueOf:(F)Ljava/lang/Float;
        44: putfield      #14                 // Field aFloatTest:Ljava/lang/Float;
        47: aload_0
        48: ldc           #15                 // String huoyingrenzhe
        50: putfield      #16                 // Field stringtest2:Ljava/lang/String;
        53: return
      LineNumberTable:
        line 11: 0
        line 12: 4
        line 13: 13
        line 14: 22
        line 15: 28
        line 16: 38
        line 17: 47
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      54     0  this   Lcom/bj58/nodetest/contract/TestModel;

好,线性表跟本地变量表也不分析

仅针对code,也就是字节码的指令进行分析。

一开始原始版本的分析,写在了excel中,如下:


111111.png

分析之后,发现自己分析的是错误的,根本对应不上,
看了下朋友推荐的文档,找到不同字节码指令的操作位,读取方式的不同
再根据这些索引值,获取类型信息,值域等等:
invoke开头的指令,包括invokespecial、invokestatic、invokeinterface、
invokevirtual、invokedynamic等,
获取的index运算方式为( index1 << 8 ) | index2 = index
最终所有index都指向常量池中的bytes所在的索引,由bytes生成具体值

图片1.png 图片2.png 图片3.png 图片4.png

正确的分析如下:

right.png

这样就能跟javap中的指令对应上了

相关文章

  • Java并发机制的底层原理

    Java程序执行:Java代码→Java字节码→字节码被类加载器加载到JVM里,JVM执行字节码→转化为汇编指令在...

  • jvm字节码指令分析

    java类: 这里我仅对 方法分析,也就是非静态的构造函数!使用javap -verbose TestModel....

  • Java并发机制的底层实现

    Java代码编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在...

  • synchronized的实现原理与应用

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令...

  • 原子操作的实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令...

  • volatile的实现原理与应用

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令...

  • Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令...

  • 2-Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CP...

  • 浅谈 JVM 3:指令集及其执行

    上文我们聊了如何参考 JVM 规范 解读 Java 字节码。但对于字节码方法字段 Code 中的 JVM 指令 执...

  • 奇门遁甲之字节码与JVM指令

    最近在研究ASM 字节码增强技术,要掌握ASM 必须要先连接Java字节码结构、JVM栈帧和常用JVM指令。 本章...

网友评论

      本文标题:jvm字节码指令分析

      本文链接:https://www.haomeiwen.com/subject/htlikqtx.html