您的位置 首页 java

如何用Java实现JVM中的运行时数据区?

一、案例介绍

本案例初步实现运行时数据区里; 线程 java 虚拟机栈、帧、操作数栈、局部变量表。

  1Run-Time Data Area
 2├── Thread
 3│   └── pc
 4│      └── Jvm Stack  
 5│       └── Frame
 6│              ├── Local Variable
 7│              └── Operand Stack
 8└── Heap
 9    ├── Method Area
10    │   └── Class
11    │       ├── Run-Time
12    │       └── Constant Pool
13    └── Object
  

二、环境准备

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

三、配置信息

  1. 调试配置
    1. 配置位置:Run/Debug Configurations -> program arguments
    2. 配置内容:-Xjre “C:Program FilesJavajdk1.8.0_161jre” E:itstackgitistack-demoitstack-demo-jvmitstack-demo-jvm-04targettest-classes org itstackdemotestHelloWorld

四、代码示例

  1itstack-demo-jvm-04
 2├── pom.xml
 3└── src
 4    └── main
 5    │    └── java
 6    │        └── org.itstack.demo.jvm
 7    │             ├── classfile
 8    │             │   ├── attributes   {BootstrapMethods/Code/ConstantValue...}
 9    │             │   ├── constantpool {CONSTANT_TAG_CLASS/CONSTANT_TAG_FIELDREF/CONSTANT_TAG_METHODREF...}
10    │             │   ├── ClassFile.java
11    │             │   ├── ClassReader.java
12    │             │   └── MemberInfo.java    
13    │             ├── classpath
14    │             │   ├── impl
15    │             │   │   ├── CompositeEntry.java
16    │             │   │   ├── DirEntry.java 
17    │             │   │   ├── WildcardEntry.java 
18    │             │   │   └── ZipEntry.java    
19    │             │   ├── Classpath.java
20    │             │   └── Entry.java   
21    │             ├── rtda
22    │             │   ├── Frame.java
23    │             │   ├── JvmStack.java
24    │             │   ├── LocalVars.java
25    │             │   ├── OperandStack.java
26    │             │   ├── Slot.java    
27    │             │   └── Thread.java
28    │             ├── Cmd.java
29    │             └── Main.java
30    └── test
31         └── java
32             └── org.itstack.demo.test
33                 └── HelloWorld.java
  

Frame.java

  1package org.itstack.demo.jvm.rtda;
 2
 3/**
 4 * 
 5 * create by fuzhengwei on 2019/4/26
 6 * 栈帧
 7 */ 8public class Frame {
 9
10    //stack is implemented as linked list
11    Frame lower;
12
13    //局部变量表
14    private LocalVars localVars;
15
16    //操作数栈
17    private OperandStack operandStack;
18
19    public Frame(int maxLocals, int maxStack) {
20        this.localVars = new LocalVars(maxLocals);
21        this.operandStack = new OperandStack(maxStack);
22    }
23
24    public LocalVars localVars(){
25        return localVars;
26    }
27
28    public OperandStack operandStack(){
29        return operandStack;
30    }
31
32}
  

JvmStack.java

  1package org.itstack.demo.jvm.rtda;
 2
 3/**
 4 * 
 5 * create by fuzhengwei on 2019/4/26
 6 * 虚拟机栈
 7 */ 8public class JvmStack {
 9
10    private int maxSize;
11    private int size;
12    private Frame _ top ;
13
14    public JvmStack(int maxSize) {
15        this.maxSize = maxSize;
16    }
17
18    public void push(Frame frame) {
19        if (this.size > this.maxSize) {
20            throw new StackOverflowError();
21        }
22
23        if (this._top != null) {
24            frame.lower = this._top;
25        }
26
27        this._top = frame;
28        this.size++;
29    }
30
31    public Frame pop() {
32        if (this._top == null) {
33            throw new RuntimeException("jvm stack is empty!");
34        }
35
36        Frame top = this._top;
37        this._top = top.lower;
38        top.lower = null;
39        this.size--;
40
41        return top;
42    }
43
44    public Frame top(){
45        if (this._top == null){
46            throw new RuntimeException("jvm stack is empty!");
47        }
48        return this._top;
49    }
50
51}
  

LocalVars.java

  1package org.itstack.demo.jvm.rtda;
 2
 3/**
 4 * 
 5 * create by fuzhengwei on 2019/4/26
 6 * 局部变量表
 7 */ 8public class LocalVars {
 9
10    private Slot[] slots;
11
12    public LocalVars(int maxLocals) {
13        if (maxLocals > 0) {
14            slots = new Slot[maxLocals];
15            for (int i = 0; i < maxLocals; i++) {
16                slots[i] = new Slot();
17            }
18        }
19    }
20
21    public void setInt(int idx, int val) {
22        this.slots[idx].num = val;
23    }
24
25    public int getInt(int idx) {
26        return slots[idx].num;
27    }
28
29    public void setFloat(int idx, float val) {
30        this.slots[idx].num = (Float.valueOf(val)).intValue();
31    }
32
33    public Float getFloat(int idx) {
34        int num = this.slots[idx].num;
35        return (float) num;
36    }
37
38    public void set long (int idx, long val) {
39        this.slots[idx].num = (int) val;
40        this.slots[idx + 1].num = (int) (val >> 32);
41    }
42
43    public Long getLong(int idx) {
44        int low = this.slots[idx].num;
45        int high = this.slots[idx + 1].num;
46        return ((long) high << 32) | (long) low;
47    }
48
49    public void setDouble(int idx, double val) {
50        setLong(idx, (long) val);
51    }
52
53    public Double getDouble(int idx) {
54        return Double.valueOf(getLong(idx));
55    }
56
57    public void setRef(int idx, Object ref) {
58        slots[idx].ref = ref;
59    }
60
61    public Object getRef(int idx) {
62        return slots[idx].ref;
63    }
64
65}
  

OperandStack.java

  1package org.itstack.demo.jvm.rtda;
 2
 3/**
 4 * 
 5 * create by fuzhengwei on 2019/4/26
 6 * 操作数栈
 7 */ 8public class OperandStack {
 9
10    private int size = 0;
11    private Slot[] slots;
12
13    public OperandStack(int maxStack) {
14        if (maxStack > 0) {
15            slots = new Slot[maxStack];
16            for (int i = 0; i < maxStack; i++) {
17                slots[i] = new Slot();
18            }
19        }
20    }
21
22    public void pushInt(int val) {
23        slots[size].num = val;
24        size++;
25    }
26
27    public int popInt(){
28        size --;
29        return slots[size].num;
30    }
31
32    public void pushRef(Object ref){
33        slots[size].ref = ref;
34        size++;
35    }
36
37    public Object popRef(){
38        size --;
39        Object ref = slots[size].ref;
40        slots[size].ref = null;
41        return ref;
42    }
43
44}
  

Slot.java

  1package org.itstack.demo.jvm.rtda;
 2
 3/**
 4 * 
 5 * create by fuzhengwei on 2019/4/26
 6 * 数据槽
 7 */ 8public class Slot {
 9
10    int num;
11    Object ref;
12
13}
  

Thread.java

  1package org.itstack.demo.jvm.rtda;
 2
 3/**
 4 * 
 5 * create by fuzhengwei on 2019/4/26
 6 * 线程
 7 */ 8public class Thread {
 9
10    //Program Counter 寄存器
11    private int pc;
12
13    //虚拟机栈
14    private JvmStack stack;
15
16    public Thread(){
17        this.stack = new JvmStack(1024);
18    }
19
20    public int pc(){
21        return this.pc;
22    }
23
24    public void setPC(int pc){
25        this.pc = pc;
26    }
27
28    public void pushFrame(Frame frame){
29        this.stack.push(frame);
30    }
31
32    public Frame popFrame(){
33        return this.stack.pop();
34    }
35
36    public Frame currentFrame(){
37        return this.stack.top();
38    }
39
40}
  

五、测试结果

 1100
2-100
3null
4-100  

今天的分享就到这了,我这里准备了一套java进阶方法笔记,学习资料面试题,电子书等免费笔记供大家学习.需要的小伙伴私信我回复”Java”即可领取免费资料.

java核心知识点

文章来源:智云一二三科技

文章标题:如何用Java实现JVM中的运行时数据区?

文章地址:https://www.zhihuclub.com/193633.shtml

关于作者: 智云科技

热门文章

网站地图