• Java JVM虚拟机


    加载字节码文件.class

    1字节一般为8位

    字节码结构:

    第一部分 4字节 cafebaby 第二部分 版本号 00 00 00 32,

    第三部分 常量数量 count

    第四部分常量池 

    常量类型表示:

    继承关系改变 1.1以后

    后面是属性方法 等参数

    通过javap 反编译class ,javap xx.class

    javap -c xxx.class 

    javap -v xx.class

    常量池 29-1

    ( ) V 表示返回值viod

    stack 操作数栈,如果相加,两个数入栈 然后add

    locals  本地变量表 存放结果

    args_size  = x 参数数量,0位表示this,如果只有一个参数,则size = 3,double 占用两个, this 占用1个

    栈的空间大小slot

    字节一般是0-255

    ...

    字节码助记符指令含义
    0x00nopNone
    0x01aconst_null将null推送至栈顶
    0x02iconst_m1将int型-1推送至栈顶
    0x03iconst_0将int型0推送至栈顶
    0x04iconst_1将int型1推送至栈顶
    0x05iconst_2将int型2推送至栈顶
    0x06iconst_3将int型3推送至栈顶
    0x07iconst_4将int型4推送至栈顶
    0x08iconst_5将int型5推送至栈顶
    0x09lconst_0将long型0推送至栈顶
    0x0alconst_1将long型1推送至栈顶
    0x0bfconst_0将float型0推送至栈顶
    0x0cfconst_1将float型1推送至栈顶
    0x0dfconst_2将float型2推送至栈顶
    0x0edconst_0将double型0推送至栈顶
    0x0fdconst_1将double型1推送至栈顶
    0x10bipush将单字节的常量值(-128~127)推送至栈顶
    0x11sipush将一个短整型常量(-32768~32767)推送至栈顶
    0x12ldc将int,float或String型常量值从常量池中推送至栈顶
    0x13ldc_w将int,float或String型常量值从常量池中推送至栈顶(宽索引)
    0x14ldc2_w将long或double型常量值从常量池中推送至栈顶(宽索引)
    0x15iload将指定的int型本地变量推送至栈顶
    0x16lload将指定的long型本地变量推送至栈顶
    0x17fload将指定的float型本地变量推送至栈顶
    0x18dload将指定的double型本地变量推送至栈顶
    0x19aload将指定的引用类型本地变量推送至栈顶
    0x1aiload_0将第一个int型本地变量推送至栈顶
    0x1biload_1将第二个int型本地变量推送至栈顶
    0x1ciload_2将第三个int型本地变量推送至栈顶
    0x1diload_3将第四个int型本地变量推送至栈顶
    0x1elload_0将第一个long型本地变量推送至栈顶
    0x1flload_1将第二个long型本地变量推送至栈顶
    0x20lload_2将第三个long型本地变量推送至栈顶
    0x21lload_3将第四个long型本地变量推送至栈顶
    0x22fload_0将第一个float型本地变量推送至栈顶
    0x23fload_1将第二个float型本地变量推送至栈顶
    0x24fload_2将第三个float型本地变量推送至栈顶
    0x25fload_3将第四个float型本地变量推送至栈顶
    0x26dload_0将第一个double型本地变量推送至栈顶
    0x27dload_1将第二个double型本地变量推送至栈顶
    0x28dload_2将第三个double型本地变量推送至栈顶
    0x29dload_3将第四个double型本地变量推送至栈顶
    0x2aaload_0将第一个引用类型本地变量推送至栈顶
    0x2baload_1将第二个引用类型本地变量推送至栈顶
    0x2caload_2将第三个引用类型本地变量推送至栈顶
    0x2daload_3将第四个引用类型本地变量推送至栈顶
    0x2eiaload将int型数组指定索引的值推送至栈顶
    0x2flaload将long型数组指定索引的值推送至栈顶
    0x30faload将float型数组指定索引的值推送至栈顶
    0x31daload将double型数组指定索引的值推送至栈顶
    0x32aaload将引用类型数组指定索引的值推送至栈顶
    0x33baload将boolean或byte型数组指定索引的值推送至栈顶
    0x34caload将char型数组指定索引的值推送至栈顶
    0x35saload将short型数组指定索引的值推送至栈顶
    0x36istore将栈顶int型数值存入指定本地变量
    0x37lstore将栈顶long型数值存入指定本地变量
    0x38fstore将栈顶float型数值存入指定本地变量
    0x39dstore将栈顶double型数值存入指定本地变量
    0x3aastore将栈顶引用类型数值存入指定本地变量
    0x3bistore_0将栈顶int型数值存入第一个本地变量
    0x3cistore_1将栈顶int型数值存入第二个本地变量
    0x3distore_2将栈顶int型数值存入第三个本地变量
    0x3eistore_3将栈顶int型数值存入第四个本地变量
    0x3flstore_0将栈顶long型数值存入第一个本地变量
    0x40lstore_1将栈顶long型数值存入第二个本地变量
    0x41lstore_2将栈顶long型数值存入第三个本地变量
    0x42lstore_3将栈顶long型数值存入第四个本地变量
    0x43fstore_0将栈顶float型数值存入第一个本地变量
    0x44fstore_1将栈顶float型数值存入第二个本地变量
    0x45fstore_2将栈顶float型数值存入第三个本地变量
    0x46fstore_3将栈顶float型数值存入第四个本地变量
    0x47dstore_0将栈顶double型数值存入第一个本地变量
    0x48dstore_1将栈顶double型数值存入第二个本地变量
    0x49dstore_2将栈顶double型数值存入第三个本地变量
    0x4adstore_3将栈顶double型数值存入第四个本地变量
    0x4bastore_0将栈顶引用型数值存入第一个本地变量
    0x4castore_1将栈顶引用型数值存入第二个本地变量
    0x4dastore_2将栈顶引用型数值存入第三个本地变量
    0x4eastore_3将栈顶引用型数值存入第四个本地变量
    0x4fiastore将栈顶int型数值存入指定数组的指定索引位置
    0x50lastore将栈顶long型数值存入指定数组的指定索引位置
    0x51fastore将栈顶float型数值存入指定数组的指定索引位置
    0x52dastore将栈顶double型数值存入指定数组的指定索引位置
    0x53aastore将栈顶引用型数值存入指定数组的指定索引位置
    0x54bastore将栈顶boolean或byte型数值存入指定数组的指定索引位置
    0x55castore将栈顶char型数值存入指定数组的指定索引位置
    0x56sastore将栈顶short型数值存入指定数组的指定索引位置
    0x57pop将栈顶数值弹出(数值不能是long或double类型的)
    0x58pop2将栈顶的一个(对于非long或double类型)或两个数值(对于非long或double的其他类型)弹出
    0x59dup复制栈顶数值并将复制值压入栈顶
    0x5adup_x1复制栈顶数值并将两个复制值压入栈顶
    0x5bdup_x2复制栈顶数值并将三个(或两个)复制值压入栈顶
    0x5cdup2复制栈顶一个(对于long或double类型)或两个(对于非long或double的其他类型)数值并将复制值压入栈顶
    0x5ddup2_x1dup_x1指令的双倍版本
    0x5edup2_x2dup_x2指令的双倍版本
    0x5fswap将栈顶最顶端的两个数值互换(数值不能是long或double类型)
    0x60iadd将栈顶两int型数值相加并将结果压入栈顶
    0x61ladd将栈顶两long型数值相加并将结果压入栈顶
    0x62fadd将栈顶两float型数值相加并将结果压入栈顶
    0x63dadd将栈顶两double型数值相加并将结果压入栈顶
    0x64isub将栈顶两int型数值相减并将结果压入栈顶
    0x65lsub将栈顶两long型数值相减并将结果压入栈顶
    0x66fsub将栈顶两float型数值相减并将结果压入栈顶
    0x67dsub将栈顶两double型数值相减并将结果压入栈顶
    0x68imul将栈顶两int型数值相乘并将结果压入栈顶
    0x69lmul将栈顶两long型数值相乘并将结果压入栈顶
    0x6afmul将栈顶两float型数值相乘并将结果压入栈顶
    0x6bdmul将栈顶两double型数值相乘并将结果压入栈顶
    0x6cidiv将栈顶两int型数值相除并将结果压入栈顶
    0x6dldiv将栈顶两long型数值相除并将结果压入栈顶
    0x6efdiv将栈顶两float型数值相除并将结果压入栈顶
    0x6fddiv将栈顶两double型数值相除并将结果压入栈顶
    0x70irem将栈顶两int型数值作取模运算并将结果压入栈顶
    0x71lrem将栈顶两long型数值作取模运算并将结果压入栈顶
    0x72frem将栈顶两float型数值作取模运算并将结果压入栈顶
    0x73drem将栈顶两double型数值作取模运算并将结果压入栈顶
    0x74ineg将栈顶int型数值取负并将结果压入栈顶
    0x75lneg将栈顶long型数值取负并将结果压入栈顶
    0x76fneg将栈顶float型数值取负并将结果压入栈顶
    0x77dneg将栈顶double型数值取负并将结果压入栈顶
    0x78ishl将int型数值左移指定位数并将结果压入栈顶
    0x79lshl将long型数值左移指定位数并将结果压入栈顶
    0x7aishr将int型数值右(带符号)移指定位数并将结果压入栈顶
    0x7blshr将long型数值右(带符号)移指定位数并将结果压入栈顶
    0x7ciushr将int型数值右(无符号)移指定位数并将结果压入栈顶
    0x7dlushr将long型数值右(无符号)移指定位数并将结果压入栈顶
    0x7eiand将栈顶两int型数值"按位与"并将结果压入栈顶
    0x7fland将栈顶两long型数值"按位与"并将结果压入栈顶
    0x80ior将栈顶两int型数值"按位或"并将结果压入栈顶
    0x81lor将栈顶两long型数值"按位或"并将结果压入栈顶
    0x82ixor将栈顶两int型数值"按位异或"并将结果压入栈顶
    0x83lxor将栈顶两long型数值"按位异或"并将结果压入栈顶
    0x84iinc将指定int型变量增加指定值(如i++, i--, i+=2等)
    0x85i2l将栈顶int型数值强制转换为long型数值并将结果压入栈顶
    0x86i2f将栈顶int型数值强制转换为float型数值并将结果压入栈顶
    0x87i2d将栈顶int型数值强制转换为double型数值并将结果压入栈顶
    0x88l2i将栈顶long型数值强制转换为int型数值并将结果压入栈顶
    0x89l2f将栈顶long型数值强制转换为float型数值并将结果压入栈顶
    0x8al2d将栈顶long型数值强制转换为double型数值并将结果压入栈顶
    0x8bf2i将栈顶float型数值强制转换为int型数值并将结果压入栈顶
    0x8cf2l将栈顶float型数值强制转换为long型数值并将结果压入栈顶
    0x8df2d将栈顶float型数值强制转换为double型数值并将结果压入栈顶
    0x8ed2i将栈顶double型数值强制转换为int型数值并将结果压入栈顶
    0x8fd2l将栈顶double型数值强制转换为long型数值并将结果压入栈顶
    0x90d2f将栈顶double型数值强制转换为float型数值并将结果压入栈顶
    0x91i2b将栈顶int型数值强制转换为byte型数值并将结果压入栈顶
    0x92i2c将栈顶int型数值强制转换为char型数值并将结果压入栈顶
    0x93i2s将栈顶int型数值强制转换为short型数值并将结果压入栈顶
    0x94lcmp比较栈顶两long型数值大小, 并将结果(1, 0或-1)压入栈顶
    0x95fcmpl比较栈顶两float型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将-1压入栈顶
    0x96fcmpg比较栈顶两float型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将1压入栈顶
    0x97dcmpl比较栈顶两double型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将-1压入栈顶
    0x98dcmpg比较栈顶两double型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将1压入栈顶
    0x99ifeq当栈顶int型数值等于0时跳转
    0x9aifne当栈顶int型数值不等于0时跳转
    0x9biflt当栈顶int型数值小于0时跳转
    0x9cifge当栈顶int型数值大于等于0时跳转
    0x9difgt当栈顶int型数值大于0时跳转
    0x9eifle当栈顶int型数值小于等于0时跳转
    0x9fif_icmpeq比较栈顶两int型数值大小, 当结果等于0时跳转
    0xa0if_icmpne比较栈顶两int型数值大小, 当结果不等于0时跳转
    0xa1if_icmplt比较栈顶两int型数值大小, 当结果小于0时跳转
    0xa2if_icmpge比较栈顶两int型数值大小, 当结果大于等于0时跳转
    0xa3if_icmpgt比较栈顶两int型数值大小, 当结果大于0时跳转
    0xa4if_icmple比较栈顶两int型数值大小, 当结果小于等于0时跳转
    0xa5if_acmpeq比较栈顶两引用型数值, 当结果相等时跳转
    0xa6if_acmpne比较栈顶两引用型数值, 当结果不相等时跳转
    0xa7goto无条件跳转
    0xa8jsr跳转至指定的16位offset位置, 并将jsr的下一条指令地址压入栈顶
    0xa9ret返回至本地变量指定的index的指令位置(一般与jsr或jsr_w联合使用)
    0xaatableswitch用于switch条件跳转, case值连续(可变长度指令)
    0xablookupswitch用于switch条件跳转, case值不连续(可变长度指令)
    0xacireturn从当前方法返回int
    0xadlreturn从当前方法返回long
    0xaefreturn从当前方法返回float
    0xafdreturn从当前方法返回double
    0xb0areturn从当前方法返回对象引用
    0xb1return从当前方法返回void
    0xb2getstatic获取指定类的静态域, 并将其压入栈顶
    0xb3putstatic为指定类的静态域赋值
    0xb4getfield获取指定类的实例域, 并将其压入栈顶
    0xb5putfield为指定类的实例域赋值
    0xb6invokevirtual调用实例方法
    0xb7invokespecial调用超类构建方法, 实例初始化方法, 私有方法
    0xb8invokestatic调用静态方法
    0xb9invokeinterface调用接口方法
    0xbainvokedynamic调用动态方法
    0xbbnew创建一个对象, 并将其引用引用值压入栈顶
    0xbcnewarray创建一个指定的原始类型(如int, float, char等)的数组, 并将其引用值压入栈顶
    0xbdanewarray创建一个引用型(如类, 接口, 数组)的数组, 并将其引用值压入栈顶
    0xbearraylength获取数组的长度值并压入栈顶
    0xbfathrow将栈顶的异常抛出
    0xc0checkcast检验类型转换, 检验未通过将抛出 ClassCastException
    0xc1instanceof检验对象是否是指定类的实际, 如果是将1压入栈顶, 否则将0压入栈顶
    0xc2monitorenter获得对象的锁, 用于同步方法或同步块
    0xc3monitorexit释放对象的锁, 用于同步方法或同步块
    0xc4wide扩展本地变量的宽度
    0xc5multianewarray创建指定类型和指定维度的多维数组(执行该指令时, 操作栈中必须包含各维度的长度值), 并将其引用压入栈顶
    0xc6ifnull为null时跳转
    0xc7ifnonnull不为null时跳转
    0xc8goto_w无条件跳转(宽索引)
    0xc9jsr_w跳转至指定的32位offset位置, 并将jsr_w的下一条指令地址压入栈顶

    堆/栈/方法区/常量池

    栈会等线程创建时再创建,程序计数器记录偏移量,native则计数器为空

    多线程会多个栈

    类加载器将class文件加载到方法区

    方法区动态连接栈

    创建对象,会将对象的引用入栈

    dup 复制引用并压入栈顶

    指向方法区

    无锁状态

    根据01和倒数第三位,是0则无锁,如果第三位是1代表lock

    1 10代表重量级锁 ,1 00 轻量级锁  

    Gc回收 标记清除

    缺点,清理后不连续

    优化后会移动不清理空间,将空出的进行连续

    eden 年轻代

    老年代则为标记清除算法

    新生代则用父 复制算法

  • 相关阅读:
    如何在Spring Boot应用中使用Nacos实现动态更新数据源
    算法训练优化的经验:深入任务与数据的力量
    Java Swing程序设计-18章
    LeetCode_动态规划_中等_368.最大整除子集
    MG-Soft MIB Browser使用教程
    【LeetCode:2095. 删除链表的中间节点 + 链表】
    机器学习笔记(1)常见符号,批次梯度下降,随机梯度下降
    MySQL存储引擎
    JAVA calendar
    Linux进阶-编辑器以及Shell编程
  • 原文地址:https://blog.csdn.net/qq_29769851/article/details/134470499