一、案例介绍
本案例初步实现运行时数据区里; 线程 、 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
二、环境准备
- jdk 1.8.0
- IntelliJ IDEA Community Edition 2018.3.1 x64
三、配置信息
- 调试配置
- 配置位置:Run/Debug Configurations -> program arguments
- 配置内容:-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核心知识点