话不多说,代入一段超级EASY的代码来解读JMM
1、主角登场
public class MyObject {
//常量
final String FINAL_STR="常量";
//静态变量
static String STATIC_STR="静态变量";
//成员变量
int money=1000;
/**
* 买东西
* @param price
*/ public void buySomething(int price){
money=money-price;
}
public static void main(String[] args) {
//新建对象
MyObject myObject=new MyObject();
//调用方法
myObject.buySomething(100);
}
}
2、准备工作
javap -v MyObject.class 反编译 汇编代码
PS:此处只截取了buySomething方法的部分,完整代码可自己试试,结合下图更加便于理解 汇编指令
详见 java se/specs/ JVM s/se7/html/jvms-6.html#jvms-6.5)
public void buySomething(int);
descriptor: (I)V
flags : ACC_PUBLIC
Code:
stack=3, locals=2, args_size=2
0: aload_0 //取this对应的引用值,压入操作数栈
1: aload_0 //取this对应的引用值,压入操作数栈
2: getfield #4 // Field money:I // 引用出栈,通过引用获得对应money的值,并压入栈
5: iload_1 //从 局部变量 表中取得price的值,压入栈中
6: isub //弹出栈中的money值和price的值,进行减操作,并将结果压入栈
7: putfield #4 // Field money:I //经过上一步操作后,栈中有两个值,栈顶为上一步操作结果,栈顶下面是this引用,这一步putfield指令,用于将栈顶的值赋值给引用对象的money字段
10: return ////return void
LineNumberTable:
line 18: 0
line 19: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/jxjg/jvm/MyObject;
0 11 1 price I
3、开始表演

4、思考以下代码问题发生的原因
⑴、java. lang .OutOfMemoryError: Java heap space
byte [] bytes =new byte[16*1024*1024];
⑵、java.lang.OutOfMemoryError: Direct buffer memory
ByteBuffer byteBuffer=ByteBuffer.allocateDirect(16*1024*1024);
⑶、java.lang.StackOverflowError
public void buySomething(int price){
money=money-price;
buySomething(100);
}
5、总结
至此,我们已经清楚了解了java程序在运行时的内存分布以及实际运行中可能会遇到的问题的原因,为日后我们理解JVM性能调优及GC分析打下了坚实的基础。