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在方法中 为局部变量,存放在栈中。