JVM specification对JVM内存的描述:
主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎) 子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。
Class loader子系统的作用 :根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域)。Javsa程序员可以extends java.lang.ClassLoader类来写自己的Class loader。
Execution engine子系统的作用 :执行classes中的指令。任何JVM specification实现(JDK)的核心是Execution engine, 换句话说:Sun 的JDK 和IBM的JDK好坏主要取决于他们各自实现Execution engine的好坏。每个运行中的线程都有一个Execution engine的实例。
Native interface组件 :与native libraries交互,是其它编程语言交互的接口。
Runtime data area组件 : 这个组件就是JVM中的内存。
Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域), Java Stack(java的栈), Program Counter(程序计数器), Native method stack(本地方法栈)。Heap(堆) 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有。
Java栈
Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。
Java堆
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。
举例说明
简单的说其实 栈(stack) 就是存放变量引用的一个地方, 堆(heap) 就是存放实际对象的地方. 也就是比如: int i = 7; 这个 其实是存在栈里边的。内容为 i = 7。
Apple app = new Apple(); 这个 app 是在栈里边的 他对应的是一个内存地址也在堆里边, 而这个内存地址对应的是堆里边存放 Apple 实例的地址。
String s = "Hello World!"; 这个其实是存在另外一块静态代码区。
总体来说: 栈--主要存放引用 和基本数据类型。
堆--用来存放 new 出来的对象实例。