Stack and Heap

来源:互联网 发布:海关数据米课 编辑:程序博客网 时间:2024/06/10 12:40

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