? Stack Memory (栈内存) <http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html>: 虚拟机的每一个线程都有一个私有的栈,当一个方法被调用时,下面内容被作为一个Frame (帧) <http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html>被创建并且被压入栈中:
+ 局部变量:包括基本数据类型,对象的引用和返回值地址。
+ 一个自己的操作栈:帧内局部变量进行运算时使用,也用于传递方法的参数和接受方法的返回值。
+ 一个当前方法所在类的Runtime constant pool (常量池) <http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html>的引用。
方法调用完成时,帧出栈,并销毁,无论方法是正常结束还是有未捕获的异常。
? Heap Memory(堆内存) <http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html> : 虚拟机的堆内存保存的是对象,类变量以及实例变量,它被所有线程共享,常说的垃圾回收就是对堆内存的回收。
+-----------------------+
| Stack Memory | ----------> 线程私有
+-----------------------+
| ^ | -------+
+---------|-------------+ |
| | | |
+----Heap Memory--------+ |
| | | |--> 线程共享
+---------|-------------+ |
| v | |
+-----------------------+ |
| Method Area | -------+
+-----------------------+
当JVM加载一个class时 ,将该类的一些信息保存到Method Area,包括Runtime constant pool ,方法数据,方法和构造器代码,域等。Runtime constant pool 则 包括类名,父类名,静态变量等。
Method Area在逻辑上属于Heap。不过它垃圾回收与Heap可能不同,取决于JVM的实现。
当通过new Class()方式创建一个实例时,JVM在Method Area寻址到该类的基 本信息, 同时进行相关实例的初始化(包括实例变量),存贮在Heap中。