您的位置 首页 java

满足程序员的好奇心-Java内存模型(JMM)

话不多说,代入一段超级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、开始表演

满足程序员的好奇心-Java内存模型(JMM)

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分析打下了坚实的基础。

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

文章标题:满足程序员的好奇心-Java内存模型(JMM)

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

关于作者: 智云科技

热门文章

网站地图