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. 局部变量所在的方法块执行完成,被弹出栈
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值