Java 垃圾回收 GC

在Java中内存空间分为两个区域:对象的生存空间堆和方法调用及变量的生存空间栈。

对象放在堆中(对象中的实例变量放在对象中,也就相当于放在堆中),方法调用和局部变量放在栈中。

在栈中方法会被堆在一起,栈顶上的方法就是当前正在执行的方法,当一个栈顶方法(方法A)在执行的过程中调用其他方法(方法B)时,会将调用的B放在栈顶(入栈),当方法B执行完毕后,它的堆栈块会被释放(出栈),接着执行未完成的方法A。

非primitive的变量只是保存对象的引用而已,而不是对象本身。不论对象是否声明或创建,如果局部变量是对该对象的引用,只有变量本身会放在栈上。
无论对象在哪里声明,它总是运行在堆上。但是对象的引用在栈上。

在新建(实例化)一个对象(对象A)的时候,java会依据基本数据类型的大小为实例变量留下空间,int需要32位,long需要64位。如果实例变量是一个对象(对象B),在对象A的空间中会保留对象B的引用所用到的空间,而对象B本身的空间会它在实例化的时候占在堆上。

如果一个对象有父类,在实例化一个对象时会先调用父类的构造函数。因为子类继承父类的实例变量,在堆中新建子类的时候必须要先在堆中创建出父类。

对象的声明周期:
1、当对象在一个方法中被实例化的时候,方法结束之后,方法所在的栈顶被释放,对象就会等待被垃圾收集器回收。
2、对象的引用被再次实例化的时候,第一个对象就会等待被垃圾收集器回收。
3、将对象引用设置为null,对象就会等待被垃圾收集器回收。

以上三种情况都是,对象已经被创建但是没有对应的对象引用和它连接,也就相当于一个被弃用的对象,此时被抛弃的对象只有等待被垃圾收集器回收。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值