为了屏蔽各种硬件和操作系统的内存拜访差别,JVM制订了一套JMM内存模型来实现同一套Java程序在不同平台上实现一样的运行成果。也就是一次编译到处运行跨平台的成果。
JVM内存调配概念
JVM两个重要的概念:堆(Heap)
和栈(Stack)
Java中Heap是运行时数据区,有垃圾收集器负责,它的劣势的是动静分配内存,生命周期不用当时通知编译器,在运行时动静分配内存,JVM垃圾收集器会主动回收不再应用的数据.毛病是:因为是在运行时调配的内存,所以存取速度绝对较慢。Java中的Stack比Heap存取速度快,仅次于寄存器,Stack中的数据能够是共享的。然而栈的毛病是生命周期在编译器就曾经确定,不足灵活性,次要放一些根本类型的变量。
JMM要求调用栈和局本变量(本地变量)放在Stack上,对象放在Heap上。一个局部变量能够援用一个对象,而这个对象是放在Heap上。一个类可能有办法,办法中的局部变量也是放在线程栈上,即便这些办法所属的对象仍然在Heap上。一个对象的成员变量可能会随着这个对象寄存在Heap上,不论这个成员变量是根本类型还是援用类型,动态成员变量追随类的定义一起放在Heap上。寄存在堆上对象,能够被持有这个对象的线程拜访。
当一个线程能够拜访一个对象,它能够拜访该对象的成员变量,如果两个线程同时调用一个对象的同一个办法,将会都拜访该对象的成员变量,然而每个线程都有了该成员变量的公有拷贝。