java内存管理垃圾回收的面试题目

本文深入探讨Java中对象引用与垃圾回收的过程,解释了`obj1 = obj2;`与`obj1 = obj3;`的区别,以及如何通过代码判断对象是否符合垃圾收集器的回收标准。对比不同书籍的解释,澄清了Java对象引用赋值对内存管理的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先得理解Object obj1 = new Object(); obj1只是对象句柄(指向堆中对象的引用)真实的对象被分配在堆空间,由obj1指向堆中的对象。obj2和obj3同上。 
obj1=obj2;是将obj2的引用赋给obj1;也就是说obj1和obj2同时指向先前obj2指向的对象,obj1先前创建的对象已没有引用指向它,这时候obj1先前创建的对象已符合回收标准,obj1= obj3;同上都是赋值引用
只要堆中的对象还有对象句柄指向它,就不符合回收标准。堆中的对象如果没有引用指向它。jvm会在一个不确定的时间执行垃圾收集,这个时间是程序不能控制的,即使手动调用gc,也只是建议jvm执行垃圾收集,jvm并不一定会马上做垃圾收集。
Object obj1 = new Object();/*对象A*/
Object obj2 = new Object();/*对象B*/
Object obj3 = new Object();/*对象C*/
obj1 = obj2;/*1*/
obj1 = obj3;/*2*/
obj3 = null;/*3*/
obj1 = null;/*4*/
java程序员面试宝典上说,到/*4*/这句代码,对象C符合垃圾收集器收集标准,而1,2,3句都没有对象符合回收标准;而我从[java编程艺术](高永强)上看到的类似例子,说的是在/*1*/这句对象A就已经符合回收标准了。确实在/*1*/句的时候对象A已经不可达,但是不同书本上的说法让我很困惑。求解惑!


转载于:https://my.oschina.net/thomas2/blog/304023

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值