java在内存中的存储结构 堆 栈

堆 heap

对象都是存储在堆中,可以随时调用

栈 stack

特殊的线性存储结构,后进先出 first in larst out。 方法调用及变量生存空间

局部变量和实例变量

局部变量

局部变量又称为栈变量,存储在栈中 方法存储在方法栈中,方法中的变量为局部变量,方法执行完成后,局部变量随着方法一起被垃圾回收,所以方法执行完成后,局部变量不可以访问

public void func1(){
          
   
	int i = 0;
	func2();
}
public void func2(){
          
   
	int j = 1;
	func3(j)
}
public void func3(int a){
          
   
	int b = a;
}

局部变量中的引用类型,引用类型变量存储的是对象在堆中的地址,所以引用变量的值也是存储在栈中的(在没有初始化前,引用变量的值为null,实例对象后new ,会在堆中开辟一个空间存储这个对象),而对象仍然是存在堆中,当这个方法调用结束后,这个引用变量随着方法被一起出栈销毁,而引用变量指向的对象会被java虚拟机判断为可回收的状态,等待垃圾回收。

实例变量

实例变量就是对象的属性,和对象共存亡,存储在堆中 age就是People的实例变量,当实例一个People时 People people = new People(); people存放在堆中,age也属于其中 当people被垃圾回收,age也被回收

public class People{
          
   
	int age=1;
	Dog dog= new Dog;
}

实例变量中的引用类型,引用类型的值也是存在这个对象中的,也就是堆。而引用类型所指的对象会重新开辟一块堆内存存储(引用类型变量未赋值时是null,基本类型也有默认值,int 0,Boolean false)。

如何让堆中存储的对象变成可回收状态

  1. 将这个引用类型变量赋值null,上一个对象变成可回收
  2. 将这个引用类型变量重新赋值,上一个对象变成可回收
  3. 局部变量所在的方法块执行完成,被弹出栈
经验分享 程序员 微信小程序 职场和发展