标签:
1. 栈与堆:生存空间
1.1 在java中,程序员会在乎内存中的两种区域:对象的生存空间堆(heap)和方法调用及变量的生存空间(stack)。
1.2 我们知道所有的对象都存活于可垃圾回收的堆上,但是我么还没看过变量的生存空间。而变量存在于哪一个空间要看它是哪一种变量而定。
这里说的“哪一种”不是它的类型,而是实例变量或局部变量。后者这种区域变量又被称为栈变量,该名称已经说明了它所存在的区域。
1.3 栈与堆-----图
2. 实例变量与局部变量
2.1 实例变量:
实例变量是被声明在类而不是方法里面。它们代表每个独立对象的“字段”(每个实例都能有不同的值)。实例变量存在于所属的对象中。
public class Duck( ){
int size ; //每个Duck对象都会有独立的size;
}
2.2 局部变量:
局部变量和方法的参数都是被声明在方法中。它们是暂时的,且生命周期只限于方法被放在栈上的这段期间(也就是方法调用至执行完毕为止)。
public void foo( int x ){
int i = x + 3 ; //参数 x 和变量 i ,b 都是局部变量。
boolean b = true ;
}
3. 如果局部变量生存在栈上,那么实例变量呢?
当你新建一个Student()对象时,java必须在堆上帮Student对象找一个位置,这会需要多少空间呢?足以存放该对象所有实例变量的空间。没错,实例变量存在于对象所属的堆空间上。如果对象的实例变量为对象,Student对象只会留下实例引用对象的地址。也就是说,该实例变量将保存一个地址,而不是一个对象。
4. 内存分析图:
首先来段代码:
class Student(){
String name;//学生姓名
int age; //学生年龄
static int id;//学生id
public void study(){
....
}
public void sayHello(){
....
}
}
public class Demo{
public static void main(String[] args){
Student st1=new Student();
st1.name="陈大爷";
st1.age=20;
Student.id=6;
st1.study();
st1.sayHello();
}
}
以上面代码为例的内存分析图:
解释:(结合上面的知识点)
s1 是在main方法里面的局部变量。所以它是放在Main方法的栈里头。
new Student();创建了一个对象。因为是对象,所以它被放到了堆中。---->也就是图中的s1对象。
内存分析
标签:
原文地址:http://www.cnblogs.com/JamKong/p/4447030.html