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