JVM 分配内存进入以下区域
1: Heap
2:Stack
3:Code
4:Static
jvm有效的管理分配到这几个内存区域。
Code section 代码区 包含这个 字节码文件 (byte code)
Stack section (栈区域) 包含 方法(methods) ,局部变量 (Local variables) 和 引用变量( reference variables)
Heap section (堆区域)包含 对象 (也许会包含引用变量(下面的例子中有提到))
Static section (静态区域) 包含 静态数据/ 方法 (Static 数据 和 方法 为 类的方法,隶属于类)
实例变量 和 局部变量 的区别:
实例变量 声明在一个类的内部,而不是在方法的内部,就是在方法的外部,且不能带静态 static 修饰符。
以下例子中:
其中 num 为实例变量, 如果 前面带有static 那就是 类变量 全局变量 隶属于 类。
class Student{ int num; // num is instance variable public void showData{} }
局部变量是声明在方法的内部,包含方法的参数,统称为 局部变量。
以下例子中 a 和 x都是局部变量。
public void sum(int a){ int x = int a + 3; // a , x are local variables } }
记住以下几点(Points to Remember:)
1:当一个方法被调用时, a frame 是被创建在 栈顶。
2:一旦方法完成执行,控制流返回正在调用的方法,stack 中 frame 被 清空(flushed)
3:局部变量是在栈中创建。
4:实例变量在堆中创建, 是对象的一部分,实例变量 依附于对象。
5:引用变量是在栈中创建。
思考: 如果一个对象的实例变量 引用了 另外一个对象 会怎样?
public static void main(String args[]){ A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
在这个例子中, 引用变量 B child 将在堆中创建,指向它对应 heap 堆中的对象,
下面的图显示了 这个引用关系:
child 为 引用变量 指向 堆中的 用B类创建的 child对象, 其中 parent在方法中 为局部变量,存放在栈中。