Java的内存由JVM管理,分为堆、栈、方法区三部分。
1. 堆
1)用于存储所有new出来的对象(包括实例变量)。
2)实例变量的生命周期: 创建(new)对象时存在堆中,对象被GC回收时一并消失。
3)垃圾回收器(GC)不定时到堆中查看,看到垃圾则自动回收。 垃圾:没有任何引用所指向的对象。 回收过程是透明的,并非一看到垃圾就马上回收。 若想让它快一点回收,可以调用System.gc()。
4)内存泄露:不再使用的对象没有被及时地回收。 建议:当对象不再使用时,应及时将引用设置为null。
2. 栈(堆栈)
1)用于存储正在调用中的所有局部变量(包括参数)。
2)调用方法时在栈中为该方法分配一块对应的栈桢。 栈桢中包含所有的局部变量(包括参数)。 方法调用结束时,栈桢消失,局部变量一并消失。
3)局部变量的生命周期: 调用方法时存在栈中,方法调用结束时与栈桢一并消失。
3. 方法区
1)用于存储.class字节码文件(包括静态变量和方法)。
2)方法只有一份。通过this来区分具体是哪个对象引用的。
3)静态变量只有一份。建议通过类名.来访问。
4. 成员变量和局部变量
成员变量分为实例变量和静态变量
1)实例变量:
1.1)属于对象的,存在堆中;
1.2)有几个对象就有几份实例变量;
1.3)必须通过对象名.来访问。
2)静态变量:
2.1)属于类的,存在方法区中;
2.2)只有一份;
2.3)建议通过类名.来访问;
2.4)何时用:所有对象的数据都一样时使用,只有一份。
成员变量:
1)类中,方法外;
2)实例变量:new时存在堆中,对象被回收时消失;
静态变量:存在方法区中;
3)有默认值。
局部变量:
1)方法中;
2)调方法时存在栈中,方法调用结束时与栈桢一并消失;
3)没有默认值。