zoukankan      html  css  js  c++  java
  • jvm 字节码学习(1)

    jvm 字节码速查表:
    https://blog.csdn.net/oYinHeZhiGuang/article/details/102790251

    1. 是不是只有java编译器才可以将java转为class 字节码文件?
      不是的,jRuby/Groovy/Scala/Jython 都是可以编译成字节码文件的。

    2. 计算机是以010101的方式执行的。

    3. 什么是u1,u2,u4,u8
      u1: 一个字节;
      u2: 二个字节;
      u4: 4个字节;
      u8:8个字节;

    4. 字节码的具体解释
      第一个u4 字节代表的是一个class 文件:cafe babe (固定的)
      第二个u4 字节JDK 编译的版本号:jdk7->51,jdk8->52

      无符号数:就是数值;
      表: 就是一个结构,类似于一个结构:

      xxx_info{
      }
      

      字面量: int m=3(字面量就是=号右边的东西)
      符号引用:包含三类常量:1.类和接口的全限定名;2. 字段的名称和描述符;3. 方法的名称和描述符
      init和clinit:
      init:实例化初始化方法。调用new 初始化对象的时候;2. 调用反射的时候newInstance();3. 调用clone方法的时候;4.ObjectInputstream.getObject()调用。
      clinit: 类和接口的初始化.所有的类变量初始化语句和静态初始化语句都被java 编译器搜集在一起,放到clinit.

    5. 分析class文件:使用javap -v Test.class
      invokespecial #1
      第一步:到常量池里面找到#1常量(#1:MethodRef #4,#22)
      #4: 指向Class_info的索引项(u2类型数据)
      #22:指向的就是NameAndType的索引项(u2类型数据)
      第二步: 找#4号常量(#4 号常量是Class: java/lang/Thread)
      第三步:找#22 号常量(#7:#8)
      第四步:NameAndType的数据结构(u2:名称常量的索引,u2:描述符常量项的索引)
      第五步:#7 对应的
      第六步:#8 对应()V
      搜索的结果:V java/lang/Thread.()
      类的元数据:描述类的数据
      问题3:类名应该多长?
      不能超过256
      访问控制标志:0X0001|0X0020 = 0X0021 ==> 00 21 (0X0001为public ,0x0020是固定的,故0x0021就是public)
      类索引,父类索引,接口计数器
      00 03 00 04 00 02
      00 03:代表3#常量索引:com.icil.class.Test
      00 04:代表4#常量索引:java/lang/Thread
      00 02:代表有几个接口,当前是2个,(Serializable,Comparable)

  • 相关阅读:
    JAVA设计模式-设计原则
    java 8 stream特性
    使用跟踪标记查看过滤统计信息是否被使用
    找到SQL Server的序列号
    使用SSIS进行数据清洗
    找到SQL Server数据库历史增长信息
    如何查看某个查询用了多少TempDB空间
    SQL Server 2014云特性:无缝集成公有云
    SQL Server 2014新特性-原生备份加密
    强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
  • 原文地址:https://www.cnblogs.com/wanthune/p/12826385.html
Copyright © 2011-2022 走看看