垃圾回收,一个全局变量在 局部方法中位置Null,当该方法return 时

时间:2021-02-21 10:29:19

这是下午的一个面试题,

垃圾回收,一个全局变量在 局部方法中置为Null,

当该方法return 时

局部方法中 的局部变量 和该 全局变量 哪个先被回收?为什么?



我说不一定,因为全局变量 置为 null  时,只是程序员通知 系统 该内存可以回收,不是必然要回收。
而当该方法 退出方法体是  局部变量 就被回收了。

ps:大家说说吧,我觉得这一题的回答,面试官似乎不满意,以前真没考虑过

6 个解决方案

#1


个人感觉应该先回收局部变量再回收全局变量。我的理解是不管全局变量是不是null,都应该在被实例化的实体类释放时跟着释放。如果因为值为null就回收,那么如果我写的变量为a=null,这样定义岂不是还没用就直接给回收了?

#2


引用楼主  的回复:
这是下午的一个面试题,

垃圾回收,一个全局变量在 局部方法中置为Null,

当该方法return 时

局部方法中 的局部变量 和该 全局变量 哪个先被回收?为什么?



我说不一定,因为全局变量 置为 null  时,只是程序员通知 系统 该内存可以回收,不是必然要回收。
而当该方法 退出方法体是  局部变量 就被回收了。

ps:大家说说吧,我觉得这一题的回答,……

应该是java的垃圾回收期调用时自动回收吧,手动的置为空,能使回收器回收得更快。

#3


变量是放在栈
垃圾回收机制只会回收堆内存中的对象

#4


这个问题不一定的吧

我对垃圾回收的理解是这样的:当一个对象没有被任何东西引用的时候,它有可能被回收

这个跟全局变量、局部变量没关系的吧

#5


引用 2 楼  的回复:
引用楼主  的回复:
这是下午的一个面试题,

垃圾回收,一个全局变量在 局部方法中置为Null,

当该方法return 时

局部方法中 的局部变量 和该 全局变量 哪个先被回收?为什么?



我说不一定,因为全局变量 置为 null  时,只是程序员通知 系统 该内存可以回收,不是必然要回收。
而当该方法 退出方法体是  局部变量 就被回收了。

ps:大家说……


我和二楼一样的理解 不知道对不  当你设置为null 只是显示的告诉系统 此变量暂时不会被使用了 JVM的垃圾回收机制 会在一段时间内对其判断 然后进行回收..   
 不知道我说的对不  不对的请大家指出来 

#6


根本无法确定会不会回收

更无法确定谁先被回收

这完全依赖垃圾收集算法

如果你说a先回收b后回收,那一定可以实现一个jvm,让它先回收b后回收a,甚至实现一个jvm,压根就不实现垃圾回收部分,只是在内存不足的时候抛出outofmemonyerror

#1


个人感觉应该先回收局部变量再回收全局变量。我的理解是不管全局变量是不是null,都应该在被实例化的实体类释放时跟着释放。如果因为值为null就回收,那么如果我写的变量为a=null,这样定义岂不是还没用就直接给回收了?

#2


引用楼主  的回复:
这是下午的一个面试题,

垃圾回收,一个全局变量在 局部方法中置为Null,

当该方法return 时

局部方法中 的局部变量 和该 全局变量 哪个先被回收?为什么?



我说不一定,因为全局变量 置为 null  时,只是程序员通知 系统 该内存可以回收,不是必然要回收。
而当该方法 退出方法体是  局部变量 就被回收了。

ps:大家说说吧,我觉得这一题的回答,……

应该是java的垃圾回收期调用时自动回收吧,手动的置为空,能使回收器回收得更快。

#3


变量是放在栈
垃圾回收机制只会回收堆内存中的对象

#4


这个问题不一定的吧

我对垃圾回收的理解是这样的:当一个对象没有被任何东西引用的时候,它有可能被回收

这个跟全局变量、局部变量没关系的吧

#5


引用 2 楼  的回复:
引用楼主  的回复:
这是下午的一个面试题,

垃圾回收,一个全局变量在 局部方法中置为Null,

当该方法return 时

局部方法中 的局部变量 和该 全局变量 哪个先被回收?为什么?



我说不一定,因为全局变量 置为 null  时,只是程序员通知 系统 该内存可以回收,不是必然要回收。
而当该方法 退出方法体是  局部变量 就被回收了。

ps:大家说……


我和二楼一样的理解 不知道对不  当你设置为null 只是显示的告诉系统 此变量暂时不会被使用了 JVM的垃圾回收机制 会在一段时间内对其判断 然后进行回收..   
 不知道我说的对不  不对的请大家指出来 

#6


根本无法确定会不会回收

更无法确定谁先被回收

这完全依赖垃圾收集算法

如果你说a先回收b后回收,那一定可以实现一个jvm,让它先回收b后回收a,甚至实现一个jvm,压根就不实现垃圾回收部分,只是在内存不足的时候抛出outofmemonyerror