编程时你需要考虑的不是内存的物理地址(memory address),而是一种逻辑上的内存模型。
Java虚拟机将其管辖的内存大致分三个逻辑部分:
- 方法区(Method Area)、
- Java栈
- Java堆。
方法区是
静态分配(static allocation)的,编译器将变量在绑定在某个存储位置上,而且这些绑定不会在运行时改变。Java方法区的一个重要部分,也是静态分配最典型的例子,是常数池,源代码中的
命名常量、String常量和static 变量保存在其中。
Java Stack是一个逻辑概念,特点是后进先出,此外没有特别的要求。Java Stack并不代表任何特定的内存区间,也不限制它的实现方式。一个栈的空间可能是连续的,也可能是不连续的。最典型的Stack应用是方法的调 用,Java虚拟机每调用一次方法就创建一个
方法帧(frame),退出该方法则对应的方法帧被弹出(pop)。栈分配存在一些局限:Java栈所处理的方法帧和局部变量,都将随着方法帧弹出而结束,显然局部变量无法从一个帧保持到下一个帧,被调方法的帧不可能比调用方法的寿命更长。因此,从数据保存来看,
栈分配适用于由作用域决定生命周期的局部变量。
Java堆(Heap)堆分配(heap allocation)意味着以随意的顺序,在运行时进行存储空间分配和收回的内存管理模型。堆中存储的数据常常是大小、数量和生命期在编译时无法确定的。
Java对象的内存总是在heap中分配。文章来源:
http://localhost/wp2/?p=59