前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Java实现JVM第八章《数组和字符串》

用Java实现JVM第八章《数组和字符串》

原创
作者头像
小傅哥
修改2020-01-20 09:43:36
7340
修改2020-01-20 09:43:36
举报

小傅哥 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。 你用剑🗡、我用刀🔪,好的代码都很烧,望你不吝出招!

一、案例介绍

本章主要介绍如何实现让虚拟机处理数组和字符串,在虚拟机功能增强后,我们可以执行数组类型计算和输出字符串。本章需要新增实现数组指令;newarray、anewarray、arraylength、<t>aload、<t>astore、multianewarray、ldc,同时需要需要开发字符串池方法等。

数组在Java虚拟机中是给比较特殊的概念,主要有以下原因; 首先,数组类和普通的类是不同的。普通的类从class文件中加载,但是数组类由Java虚拟机在运行时生成。数组的类名是左括号([)+数组元素的类型描述符;数组的类型描述符就是类名本身。例如,int[]的类名是[I,int的类名是[[I,Object[]的类名是[Ljava/lang/Object;,String的类名是[[java/lang/String;,等等。 其次,创建数组的方式和创建普通对象的方式不同。普通对象new指令创建,然后由构造函数初始化。基本类型数组由newarray指令创建;引用类型数组由anewarray指令创建;另外还有一个专门的mulitianewarray指令用于创建多维数组。 最后,很显然,数组和普通对象存在的数据也是不同的。普通对象中存放的是实例变量,通过putfield和getfield指令存取。数组对象中存放的则是数组元素,通过<t>aload和<t>astore系列指令按索引存取。其中<t>可以是a、b、c、d、f、i、l或者s,分别用于存取引用、byte、char、double、float、int、long或者shore类型的数组。另外,还有一个arraylength指令,用于获取数组长度。

二、环境准备

  1. jdk 1.8.0
  2. IntelliJ IDEA Community Edition 2018.3.1 x64

三、配置信息

  1. 调试配置
代码语言:txt
复制
1. 配置位置:Run/Debug Configurations -> program arguments
代码语言:txt
复制
2. 配置内容(执行数组计算):-Xjre "C:\Program Files\Java\jdk1.8.0\_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-08\target\test-classes\org\itstack\demo\test\BubbleSortTest
代码语言:txt
复制
3. 配置内容(字符串的输出):-Xjre "C:\Program Files\Java\jdk1.8.0\_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-08\target\test-classes\org\itstack\demo\test\HelloWorld -verbose true -args 你好,java版虚拟机v1.0,欢迎你的到来。

四、代码示例

代码语言:txt
复制
itstack-demo-jvm-08

├── pom.xml

└── src

    └── main

    │    └── java

    │        └── org.itstack.demo.jvm

    │             ├── classfile

    │             │   ├── attributes   {BootstrapMethods/Code/ConstantValue...}

    │             │   ├── constantpool {CONSTANT\_TAG\_CLASS/CONSTANT\_TAG\_FIELDREF/CONSTANT\_TAG\_METHODREF...}

    │             │   ├── ClassFile.java

    │             │   ├── ClassReader.java

    │             │   └── MemberInfo.java   

    │             ├── classpath

    │             │   ├── impl

    │             │   │   ├── CompositeEntry.java

    │             │   │   ├── DirEntry.java 

    │             │   │   ├── WildcardEntry.java 

    │             │   │   └── ZipEntry.java    

    │             │   ├── Classpath.java

    │             │   └── Entry.java   

    │             ├── classpath

    │             │   ├── base

    │             │   │   ├── BytecodeReader.java

    │             │   │   ├── ClassInitLogic.java

    │             │   │   ├── Instruction.java

    │             │   │   ├── InstructionBranch.java

    │             │   │   ├── InstructionIndex8.java

    │             │   │   ├── InstructionIndex16.java

    │             │   │   ├── InstructionNoOperands.java    

    │             │   │   └── MethodInvokeLogic.java

    │             │   ├── comparisons

    │             │   ├── constants

    │             │   ├── control

    │             │   ├── conversions

    │             │   ├── extended

    │             │   ├── loads

    │             │   ├── math

    │             │   ├── references

    │             │   │   ├── ANEW\_ARRAY.java

    │             │   │   ├── ARRAY\_LENGTH.java

    │             │   │   ├── CHECK\_CAST.java

    │             │   │   ├── GET\_FIELD.java

    │             │   │   ├── GET\_STATIC.java

    │             │   │   ├── INSTANCE\_OF.java

    │             │   │   ├── INVOKE\_INTERFACE.java

    │             │   │   ├── INVOKE\_SPECIAL.java

    │             │   │   ├── INVOKE\_STATIC.java

    │             │   │   ├── INVOKE\_VIRTUAL.java

    │             │   │   ├── MULTI\_ANEW\_ARRAY.java

    │             │   │   ├── NEW.java

    │             │   │   ├── NEW\_ARRAY.java

    │             │   │   ├── PUT\_FIELD.java

    │             │   │   └── PUT\_STATIC.java

    │             │   ├── stack

    │             │   ├── store

    │             │   │   └── xastore

    │             │   │       ├── AASTORE.java    

    │             │   │       ├── BASTORE.java    

    │             │   │       ├── CASTORE.java    

    │             │   │       ├── DASTORE.java

    │             │   │       ├── FASTORE.java

    │             │   │       ├── IASTORE.java

    │             │   │       ├── LASTORE.java    

    │             │   │       └── SASTORE.java        

    │             │   └── Factory   

    │             ├── rtda

    │             │   ├── heap

    │             │   │   ├── constantpool

    │             │   │   ├── methodarea

    │             │   │   │   ├── Class.java    

    │             │   │   │   ├── ClassMember.java  

    │             │   │   │   ├── Field.java    

    │             │   │   │   ├── Method.java 

    │             │   │   │   ├── MethodDescriptor.java 

    │             │   │   │   ├── MethodDescriptorParser.java 

    │             │   │   │   ├── MethodLookup.java     

    │             │   │   │   ├── Object.java   

    │             │   │   │   ├── Slots.java   

    │             │   │   │   └── StringPool.java    

    │             │   │   └── ClassLoader.java  

    │             │   ├── Frame.java

    │             │   ├── JvmStack.java

    │             │   ├── LocalVars.java

    │             │   ├── OperandStack.java

    │             │   ├── Slot.java 

    │             │   └── Thread.java

    │             ├── Cmd.java

    │             ├── Interpret.java    

    │             └── Main.java

    └── test

         └── java

             └── org.itstack.demo.test

                 ├── BubbleSortTest.java

                 └── HelloWorld.java

代码片段

ANEW_ARRAY.java

代码语言:txt
复制
package org.itstack.demo.jvm.instructions.references;



import org.itstack.demo.jvm.instructions.base.InstructionIndex16;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.constantpool.ClassRef;

import org.itstack.demo.jvm.rtda.heap.constantpool.RunTimeConstantPool;

import org.itstack.demo.jvm.rtda.heap.methodarea.Class;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;



/\*\*

 \* https://bugstack.cn/

 \* create by fuzhengwei on 2019/4/29

 \* create new array of reference

 \*/

public class ANEW\_ARRAY extends InstructionIndex16 {



    @Override

    public void execute(Frame frame) {

        

        RunTimeConstantPool runTimeConstantPool = frame.method().clazz().constantPool();

        ClassRef classRef = (ClassRef) runTimeConstantPool.getConstants(this.idx);

        Class componentClass = classRef.resolvedClass();



        OperandStack stack = frame.operandStack();

        int count = stack.popInt();

        if (count < 0) {

            throw new NegativeArraySizeException();

        }



        Class arrClass = componentClass.arrayClass();

        Object arr = arrClass.newArray(count);

        stack.pushRef(arr);



    }



}

ARRAY_LENGTH.java

代码语言:txt
复制
package org.itstack.demo.jvm.instructions.references;



import org.itstack.demo.jvm.instructions.base.InstructionNoOperands;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;



/\*\*

 \* https://bugstack.cn/

 \* create by fuzhengwei on 2019/4/29

 \* get length of array

 \*/

public class ARRAY\_LENGTH extends InstructionNoOperands {



    @Override

    public void execute(Frame frame) {



        OperandStack stack = frame.operandStack();

        Object arrRef = stack.popRef();

        if (null == arrRef){

            throw new NullPointerException();

        }



        int arrLen = arrRef.arrayLength();

        stack.pushInt(arrLen);

    }



}

NEW_ARRAY.java

代码语言:txt
复制
package org.itstack.demo.jvm.instructions.references;



import org.itstack.demo.jvm.instructions.base.BytecodeReader;

import org.itstack.demo.jvm.instructions.base.Instruction;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.ClassLoader;

import org.itstack.demo.jvm.rtda.heap.methodarea.Class;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;



/\*\*

 \* https://bugstack.cn/

 \* create by fuzhengwei on 2019/4/29

 \*/

public class NEW\_ARRAY implements Instruction {



    private byte atype;



    @Override

    public void fetchOperands(BytecodeReader reader) {

        this.atype = reader.readByte();

    }



    @Override

    public void execute(Frame frame) {

        OperandStack stack = frame.operandStack();

        int count = stack.popInt();

        if (count < 0) {

            throw new NegativeArraySizeException();

        }



        ClassLoader classLoader = frame.method().clazz().loader();

        Class arrClass = getPrimitiveArrayClass(classLoader, this.atype);

        Object arr = arrClass.newArray(count);

        stack.pushRef(arr);



    }



    private Class getPrimitiveArrayClass(ClassLoader loader, byte atype){

        switch (atype) {

            case ArrayType.AT\_BOOLEAN:

                return loader.loadClass("[Z");

            case ArrayType.AT\_BYTE:

                return loader.loadClass("[B");

            case ArrayType.AT\_CHAR:

                return loader.loadClass("[C");

            case ArrayType.AT\_SHORT:

                return loader.loadClass("[S");

            case ArrayType.AT\_INT:

                return loader.loadClass("[I");

            case ArrayType.AT\_LONG:

                return loader.loadClass("[J");

            case ArrayType.AT\_FLOAT:

                return loader.loadClass("[F");

            case ArrayType.AT\_DOUBLE:

                return loader.loadClass("[D");

            default:

                throw new RuntimeException("Invalid atype!");

        }

    }



    static class ArrayType {

        static final byte AT\_BOOLEAN = 4;

        static final byte AT\_CHAR = 5;

        static final byte AT\_FLOAT = 6;

        static final byte AT\_DOUBLE = 7;

        static final byte AT\_BYTE = 8;

        static final byte AT\_SHORT = 9;

        static final byte AT\_INT = 10;

        static final byte AT\_LONG = 11;

    }



}

IASTORE.java

代码语言:txt
复制
package org.itstack.demo.jvm.instructions.stores.xastore;



import org.itstack.demo.jvm.instructions.base.InstructionNoOperands;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.OperandStack;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;



/\*\*

 \* https://bugstack.cn/

 \* create by fuzhengwei on 2019/4/29

 \*/

public class IASTORE extends InstructionNoOperands {



    @Override

    public void execute(Frame frame) {

        OperandStack stack = frame.operandStack();

        int val = stack.popInt();

        int idx = stack.popInt();

        Object arrRef = stack.popRef();



        checkNotNull(arrRef);

        int[] ints = arrRef.ints();

        checkIndex(ints.length, idx);

        ints[idx] = val;



    }



}

StringPool.java

代码语言:txt
复制
package org.itstack.demo.jvm.rtda.heap.methodarea;



import org.itstack.demo.jvm.rtda.heap.ClassLoader;



import java.util.HashMap;

import java.util.Map;



/\*\*

 \* https://bugstack.cn/

 \* create by fuzhengwei on 2019/4/29

 \*/

public class StringPool {



    private static Map<String, Object> internedStrs = new HashMap<>();



    public static Object jString(ClassLoader loader, String goStr) {

        Object internedStr = internedStrs.get(goStr);

        if (null != internedStr) return internedStr;



        char[] chars = goStr.toCharArray();

        Object jChars = new Object(loader.loadClass("[C"), chars);

        

        Object jStr = loader.loadClass("java/lang/String").newObject();

        jStr.setRefVal("value", "[C", jChars);



        internedStrs.put(goStr, jStr);

        return jStr;

    }



    public static String goString(Object jStr) {

        Object charArr = jStr.getRefVar("value", "[C");

        return new String(charArr.chars());

    }



}

Interpret.java

代码语言:txt
复制
package org.itstack.demo.jvm;



import com.alibaba.fastjson.JSON;

import org.itstack.demo.jvm.instructions.Factory;

import org.itstack.demo.jvm.instructions.base.BytecodeReader;

import org.itstack.demo.jvm.instructions.base.Instruction;

import org.itstack.demo.jvm.rtda.Frame;

import org.itstack.demo.jvm.rtda.Thread;

import org.itstack.demo.jvm.rtda.heap.ClassLoader;

import org.itstack.demo.jvm.rtda.heap.methodarea.\*;

import org.itstack.demo.jvm.rtda.heap.methodarea.Class;

import org.itstack.demo.jvm.rtda.heap.methodarea.Object;





//指令集解释器

class Interpret {



    Interpret(Method method, boolean logInst, String args) {

        Thread thread = new Thread();

        Frame frame = thread.newFrame(method);

        thread.pushFrame(frame);



        if (null != args){

            Object jArgs = createArgsArray(method.clazz().loader(), args.split(" "));

            frame.localVars().setRef(0, jArgs);

        }



        loop(thread, logInst);

    }



    private Object createArgsArray(ClassLoader loader, String[] args) {

        Class stringClass = loader.loadClass("java/lang/String");

        Object argsArr = stringClass.arrayClass().newArray(args.length);

        Object[] jArgs = argsArr.refs();

        for (int i = 0; i < jArgs.length; i++) {

            jArgs[i] = StringPool.jString(loader, args[i]);

        }

        return argsArr;

    }



    private void loop(Thread thread, boolean logInst) {

        BytecodeReader reader = new BytecodeReader();

        while (true) {

            Frame frame = thread.currentFrame();

            int pc = frame.nextPC();

            thread.setPC(pc);



            reader.reset(frame.method().code, pc);

            byte opcode = reader.readByte();

            Instruction inst = Factory.newInstruction(opcode);

            if (null == inst) {

                System.out.println("Unsupported opcode " + byteToHexString(new byte[]{opcode}));

                break;

            }

            inst.fetchOperands(reader);

            frame.setNextPC(reader.pc());



            if (logInst) {

                logInstruction(frame, inst, opcode);

            }



            //exec

            inst.execute(frame);



            if (thread.isStackEmpty()) {

                break;

            }

        }

    }



    private static void logInstruction(Frame frame, Instruction inst, byte opcode) {

        Method method = frame.method();

        String className = method.clazz().name();

        String methodName = method.name();

        String outStr = (className + "." + methodName + "() \t") +

                "寄存器(指令):" + byteToHexString(new byte[]{opcode}) + " -> " + inst.getClass().getSimpleName() + " => 局部变量表:" + JSON.toJSONString(frame.operandStack().getSlots()) + " 操作数栈:" + JSON.toJSONString(frame.operandStack().getSlots());

        System.out.println(outStr);

    }



    private static String byteToHexString(byte[] codes) {

        StringBuilder sb = new StringBuilder();

        sb.append("0x");

        for (byte b : codes) {

            int value = b & 0xFF;

            String strHex = Integer.toHexString(value);

            if (strHex.length() < 2) {

                strHex = "0" + strHex;

            }

            sb.append(strHex);

        }

        return sb.toString();

    }



}

BubbleSortTest.java

代码语言:txt
复制
package org.itstack.demo.test;



/\*\*

 \* -Xjre "C:\Program Files\Java\jdk1.8.0\_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-08\target\test-classes\org\itstack\demo\test\BubbleSortTest -verbose true

 \*/

public class BubbleSortTest {

    

    public static void main(String[] args) {

        int[] arr = {

            22, 84, 77, 11, 95,  9, 78, 56, 

            36, 97, 65, 36, 10, 24 ,92, 48

        };



        //printArray(arr);

        bubbleSort(arr);

        //System.out.println(123456789);

        printArray(arr);

    }

    

    private static void bubbleSort(int[] arr) {

        boolean swapped = true;

        int j = 0;

        int tmp;

        while (swapped) {

            swapped = false;

            j++;

            for (int i = 0; i < arr.length - j; i++) {

                if (arr[i] > arr[i + 1]) {

                    tmp = arr[i];

                    arr[i] = arr[i + 1];

                    arr[i + 1] = tmp;

                    swapped = true;

                }

            }

        }

    }

    

    private static void printArray(int[] arr) {

        for (int i : arr) {

            System.out.println(i);

        }

    }

    

}

HelloWorld.java

代码语言:txt
复制
package org.itstack.demo.test;



/\*\*

 \* -Xjre "C:\Program Files\Java\jdk1.8.0\_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-08\target\test-classes\org\itstack\demo\test\HelloWorld -verbose true -args 你好,java版虚拟机v1.0,欢迎你的到来。

 \*/

public class HelloWorld {



    public static void main(String[] args) {

        for (String str : args) {

            System.out.println(str);

        }

    }



}

五、测试结果

分为测试数组、输出字符串;

1. 测试结果一;执行数组

代码语言:txt
复制
-Xjre "C:\Program Files\Java\jdk1.8.0\_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-08\target\test-classes\org\itstack\demo\test\BubbleSortTest -verbose true

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":0},{"num":0},{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0},{"num":0},{"num":0}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0xbc -> NEW\_ARRAY => 局部变量表:[{"num":16},{"num":0},{"num":0},{"num":0}] 操作数栈:[{"num":16},{"num":0},{"num":0},{"num":0}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":0},{"num":0},{"num":0}] 操作数栈:[{"num":16,"ref":{}},{"num":0},{"num":0},{"num":0}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x03 -> ICONST\_0 => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":0}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":0}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":0}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":0}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":22}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":22}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":0},{"num":22}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":0},{"num":22}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x04 -> ICONST\_1 => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":22}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":0},{"num":22}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":1},{"num":22}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":1},{"num":22}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":1},{"num":84}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":1},{"num":84}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":1},{"num":84}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":1},{"num":84}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x05 -> ICONST\_2 => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":1},{"num":84}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":1},{"num":84}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":2},{"num":84}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":2},{"num":84}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":2},{"num":77}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":2},{"num":77}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":2},{"num":77}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":2},{"num":77}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x06 -> ICONST\_3 => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":2},{"num":77}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":2},{"num":77}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":3},{"num":77}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":3},{"num":77}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":3},{"num":11}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":3},{"num":11}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":3},{"num":11}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":3},{"num":11}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x07 -> ICONST\_4 => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":3},{"num":11}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":3},{"num":11}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":4},{"num":11}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":4},{"num":11}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":4},{"num":95}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":4},{"num":95}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":4},{"num":95}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":4},{"num":95}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x08 -> ICONST\_5 => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":4},{"num":95}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":4},{"num":95}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":5},{"num":95}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":5},{"num":95}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":5},{"num":9}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":5},{"num":9}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":5},{"num":9}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":5},{"num":9}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":5},{"num":9}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":5},{"num":9}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":6},{"num":9}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":6},{"num":9}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":6},{"num":78}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":6},{"num":78}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":6},{"num":78}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":6},{"num":78}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":6},{"num":78}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":6},{"num":78}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":7},{"num":78}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":7},{"num":78}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":7},{"num":56}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":7},{"num":56}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":7},{"num":56}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":7},{"num":56}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":7},{"num":56}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":7},{"num":56}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":8},{"num":56}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":8},{"num":56}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":8},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":8},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":8},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":8},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":8},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":8},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":9},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":9},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":9},{"num":97}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":9},{"num":97}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":9},{"num":97}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":9},{"num":97}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":9},{"num":97}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":9},{"num":97}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":10},{"num":97}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":10},{"num":97}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":10},{"num":65}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":10},{"num":65}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":10},{"num":65}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":10},{"num":65}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":10},{"num":65}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":10},{"num":65}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":11},{"num":65}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":11},{"num":65}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":11},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":11},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":11},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":11},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":11},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":11},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":12},{"num":36}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":12},{"num":36}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":12},{"num":10}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":12},{"num":10}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":12},{"num":10}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":12},{"num":10}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":12},{"num":10}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":12},{"num":10}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":13},{"num":10}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":13},{"num":10}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":13},{"num":24}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":13},{"num":24}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":13},{"num":24}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":13},{"num":24}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":13},{"num":24}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":13},{"num":24}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":14},{"num":24}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":14},{"num":24}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":14},{"num":92}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":14},{"num":92}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x59 -> DUP => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":14},{"num":92}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":14},{"num":92}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":14},{"num":92}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":14},{"num":92}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x10 -> BIPUSH => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":15},{"num":92}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":15},{"num":92}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4f -> IASTORE => 局部变量表:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":15},{"num":48}] 操作数栈:[{"num":16,"ref":{}},{"num":16,"ref":{"$ref":"$[0].ref"}},{"num":15},{"num":48}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x4c -> ASTORE\_1 => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":15},{"num":48}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":15},{"num":48}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0x2b -> ALOAD\_1 => 局部变量表:[{"num":16},{"num":16},{"num":15},{"num":48}] 操作数栈:[{"num":16},{"num":16},{"num":15},{"num":48}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0xb8 -> INVOKE\_STATIC => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":15},{"num":48}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":15},{"num":48}]

java/lang/Object.<clinit>()     寄存器(指令):0xb8 -> INVOKE\_STATIC => 局部变量表:null 操作数栈:null

java/lang/Object.<clinit>()     寄存器(指令):0xb1 -> RETURN => 局部变量表:null 操作数栈:null

... ...

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xb2 -> GET\_STATIC => 局部变量表:[{"num":9},{"num":0}] 操作数栈:[{"num":9},{"num":0}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x15 -> ILOAD => 局部变量表:[{"num":9},{"num":0}] 操作数栈:[{"num":9},{"num":0}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xb6 -> INVOKE\_VIRTUAL => 局部变量表:[{"num":9},{"num":9}] 操作数栈:[{"num":9},{"num":9}]

9

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x84 -> IINC => 局部变量表:[{"num":9},{"num":9}] 操作数栈:[{"num":9},{"num":9}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xa7 -> GOTO => 局部变量表:[{"num":9},{"num":9}] 操作数栈:[{"num":9},{"num":9}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x1d -> ILOAD\_3 => 局部变量表:[{"num":9},{"num":9}] 操作数栈:[{"num":9},{"num":9}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x1c -> ILOAD\_2 => 局部变量表:[{"num":1},{"num":9}] 操作数栈:[{"num":1},{"num":9}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xa2 -> IF\_ICMPGE => 局部变量表:[{"num":1},{"num":16}] 操作数栈:[{"num":1},{"num":16}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x2b -> ALOAD\_1 => 局部变量表:[{"num":1},{"num":16}] 操作数栈:[{"num":1},{"num":16}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x1d -> ILOAD\_3 => 局部变量表:[{"num":1,"ref":{}},{"num":16}] 操作数栈:[{"num":1,"ref":{}},{"num":16}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x2e -> IALOAD => 局部变量表:[{"num":1,"ref":{}},{"num":1}] 操作数栈:[{"num":1,"ref":{}},{"num":1}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x36 -> ISTORE => 局部变量表:[{"num":10},{"num":1}] 操作数栈:[{"num":10},{"num":1}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xb2 -> GET\_STATIC => 局部变量表:[{"num":10},{"num":1}] 操作数栈:[{"num":10},{"num":1}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x15 -> ILOAD => 局部变量表:[{"num":10},{"num":1}] 操作数栈:[{"num":10},{"num":1}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xb6 -> INVOKE\_VIRTUAL => 局部变量表:[{"num":10},{"num":10}] 操作数栈:[{"num":10},{"num":10}]

10

11

22

24

36

36

48

56

65

77

78

84

92

95

97

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x84 -> IINC => 局部变量表:[{"num":97},{"num":97}] 操作数栈:[{"num":97},{"num":97}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xa7 -> GOTO => 局部变量表:[{"num":97},{"num":97}] 操作数栈:[{"num":97},{"num":97}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x1d -> ILOAD\_3 => 局部变量表:[{"num":97},{"num":97}] 操作数栈:[{"num":97},{"num":97}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0x1c -> ILOAD\_2 => 局部变量表:[{"num":16},{"num":97}] 操作数栈:[{"num":16},{"num":97}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xa2 -> IF\_ICMPGE => 局部变量表:[{"num":16},{"num":16}] 操作数栈:[{"num":16},{"num":16}]

org/itstack/demo/test/BubbleSortTest.printArray()     寄存器(指令):0xb1 -> RETURN => 局部变量表:[{"num":16},{"num":16}] 操作数栈:[{"num":16},{"num":16}]

org/itstack/demo/test/BubbleSortTest.main()     寄存器(指令):0xb1 -> RETURN => 局部变量表:[{"num":16,"ref":{}},{"num":16},{"num":15},{"num":48}] 操作数栈:[{"num":16,"ref":{}},{"num":16},{"num":15},{"num":48}]



Process finished with exit code 0

2. 测试结果二;输出字符

代码语言:txt
复制
org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x2a -> ALOAD\_0 => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x4c -> ASTORE\_1 => 局部变量表:[{"num":0,"ref":{}},{"num":0}] 操作数栈:[{"num":0,"ref":{}},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x2b -> ALOAD\_1 => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xbe -> ARRAY\_LENGTH => 局部变量表:[{"num":0,"ref":{}},{"num":0}] 操作数栈:[{"num":0,"ref":{}},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x3d -> ISTORE\_2 => 局部变量表:[{"num":1},{"num":0}] 操作数栈:[{"num":1},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x03 -> ICONST\_0 => 局部变量表:[{"num":1},{"num":0}] 操作数栈:[{"num":1},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x3e -> ISTORE\_3 => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x1d -> ILOAD\_3 => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x1c -> ILOAD\_2 => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xa2 -> IF\_ICMPGE => 局部变量表:[{"num":0},{"num":1}] 操作数栈:[{"num":0},{"num":1}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x2b -> ALOAD\_1 => 局部变量表:[{"num":0},{"num":1}] 操作数栈:[{"num":0},{"num":1}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x1d -> ILOAD\_3 => 局部变量表:[{"num":0,"ref":{}},{"num":1}] 操作数栈:[{"num":0,"ref":{}},{"num":1}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x32 -> AALOAD => 局部变量表:[{"num":0,"ref":{}},{"num":0}] 操作数栈:[{"num":0,"ref":{}},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x3a -> ASTORE => 局部变量表:[{"num":0,"ref":{}},{"num":0}] 操作数栈:[{"num":0,"ref":{}},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xb2 -> GET\_STATIC => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

java/lang/Object.<clinit>()     寄存器(指令):0xb8 -> INVOKE\_STATIC => 局部变量表:null 操作数栈:null

java/lang/Object.<clinit>()     寄存器(指令):0xb1 -> RETURN => 局部变量表:null 操作数栈:null

java/lang/System.<clinit>()     寄存器(指令):0xb8 -> INVOKE\_STATIC => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0x01 -> ACONST\_NULL => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0xb3 -> PUT\_STATIC => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0x01 -> ACONST\_NULL => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0xb3 -> PUT\_STATIC => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0x01 -> ACONST\_NULL => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0xb3 -> PUT\_STATIC => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0x01 -> ACONST\_NULL => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0xb3 -> PUT\_STATIC => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0x01 -> ACONST\_NULL => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0xb3 -> PUT\_STATIC => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

java/lang/System.<clinit>()     寄存器(指令):0xb1 -> RETURN => 局部变量表:[{"num":0}] 操作数栈:[{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xb2 -> GET\_STATIC => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x19 -> ALOAD => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xb6 -> INVOKE\_VIRTUAL => 局部变量表:[{"num":0},{"num":0,"ref":{}}] 操作数栈:[{"num":0},{"num":0,"ref":{}}]



你好,java版虚拟机v1.0,欢迎你的到来。



org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x84 -> IINC => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xa7 -> GOTO => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x1d -> ILOAD\_3 => 局部变量表:[{"num":0},{"num":0}] 操作数栈:[{"num":0},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0x1c -> ILOAD\_2 => 局部变量表:[{"num":1},{"num":0}] 操作数栈:[{"num":1},{"num":0}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xa2 -> IF\_ICMPGE => 局部变量表:[{"num":1},{"num":1}] 操作数栈:[{"num":1},{"num":1}]

org/itstack/demo/test/HelloWorld.main()     寄存器(指令):0xb1 -> RETURN => 局部变量表:[{"num":1},{"num":1}] 操作数栈:[{"num":1},{"num":1}]

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、案例介绍
  • 二、环境准备
  • 三、配置信息
  • 四、代码示例
  • 五、测试结果
    • 1. 测试结果一;执行数组
      • 2. 测试结果二;输出字符
      相关产品与服务
      应用性能监控
      应用性能监控(Application Performance Management,APM)是一款应用性能管理平台,基于实时多语言应用探针全量采集技术,为您提供分布式性能分析和故障自检能力。APM 协助您在复杂的业务系统里快速定位性能问题,降低 MTTR(平均故障恢复时间),实时了解并追踪应用性能,提升用户体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档