Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

Stack and Heap

$
0
0

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

作者:topwqp 发表于2013-1-27 22:32:27 原文链接
阅读:44 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>