首页 > 试题广场 >

下面关于垃圾收集的说法正确的是

[单选题]
下面关于垃圾收集的说法正确的是
  • 一旦一个对象成为垃圾,就立刻被收集掉。
  • 对象空间被收集掉之后,会执行该对象的finalize方法
  • finalize方法和C++的析构函数是完全一回事情
  • 一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此

以前我是堆,你是栈

你总是能精准的找到我,给我指明出路

后来有一天我明白了

我变成了栈,你却隐身堆海

我却找不到你了,空指针了


我不愿意如此,在下一轮full gc前

我找到了object家的finalize

又找到了你,这次我不会放手


在世界重启前,一边躲着full gc一边老去


发表于 2019-12-20 22:29:54 回复(69)
1、在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行。
2、一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存(《java 编程思想》)
3、在C++中,对象的内存在哪个时刻被回收,是可以确定的,在C++中,析构函数和资源的释放息息相关,能不能正确处理析构函数,关乎能否正确回收对象内存资源。
在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行,在java中,所有的对象,包括对象中包含的其他对象,它们所占的内存的回收都依靠垃圾回收器,因此不需要一个函数如C++析构函数那样来做必要的垃圾回收工作。当然存在本地方法时需要finalize()方法来清理本地对象。在《java编程思想》中提及,finalize()方法的一个作用是用来回收“本地方法”中的本地对象
4、“但是线程并非如此”不理解,希望大佬补充
发表于 2019-11-10 10:41:35 回复(3)
对象空间被收集前执行finalize()方法,而不是对象空间被收集之后再执行,如果这样的话执行finalize()就没有意义了。
编辑于 2019-08-20 23:17:54 回复(1)
这里主要想说一下D选项,线程在其run()方法执行完以后就会释放掉内存,但是其引用不一定不存在了
发表于 2020-05-07 10:10:34 回复(0)
1.一个对象成为垃圾,是因为没有引用指向它 2.一个对象成为垃圾之后,等待垃圾回收器收集 3.什么时候收集要看垃圾回收器什么时候运行。4.垃圾被收集之前,会调用垃圾对象的finalize()方法。5.finalize方法也可以主动使用
编辑于 2019-11-18 00:10:00 回复(0)
  • finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
  • finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性
  • 不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。
发表于 2019-12-16 22:12:05 回复(0)
我觉得d应该是这样解释,一个对象没有了引用就成为了**,但是线程并非如此,它只有把它方法体内的事情执行完毕,才会成为**。
发表于 2020-09-22 23:46:07 回复(1)

成为垃圾难道不是因为“没用”吗?人家一直互相引用,一直不被回收,就不是垃圾了么

发表于 2020-01-28 21:53:09 回复(4)
作为牛客圈里的权威代表MC枫少,这小破题我居然答错了,没脸评论了。
发表于 2022-06-11 16:08:40 回复(0)
1.在java中,对象的内存在什么时候回收,取决于垃圾回收器什么时候运行。
2.一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存
3.一个对象成为垃圾是因为不再有引用指着它,就可能被垃圾回收器回收,主线程开启一个线程,当主线程运行完成,没有引用指向运行的线程,但是开启的线程还在运行,直到run方法运行结束退出,这一点和对象的垃圾回收是不一样的。
发表于 2022-05-26 14:55:56 回复(0)

finalize由object提供,在对象清理之前执行必要的清理工作

发表于 2019-10-11 08:47:42 回复(0)
答案D不严谨,被弱引用的对象也会被当成垃圾清理掉
发表于 2022-08-05 20:16:52 回复(0)
循环引用会成为垃圾吗?D选项所说的引用是根搜索法的引用链吗?还是说循环引用也算是D所说的引用?
编辑于 2020-10-22 10:33:35 回复(0)
答案是D,D选项应该也有问题,如果是循环应用,也会引起回收,但是此时还是有引用指向它
发表于 2019-11-20 10:36:13 回复(0)
重复的题目
发表于 2019-09-01 15:36:25 回复(0)
正确的说法是:
D. 一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此。
解释:
A. 一旦一个对象成为垃圾,不一定立刻被收集掉。Java的垃圾收集器是自动运行的,具体的回收时间是由垃圾收集器决定的,它会根据一些策略来确定合适的时机进行垃圾回收。

B. Java 中的 finalize() 方法是在垃圾收集器回收对象之前被调用的,而不是在对象空间被收集掉之后。但是,不建议过度依赖 finalize() 方法来释放资源,因为它的调用时机不确定,并且在现代Java中已经不推荐使用该方法。更好的做法是使用 try-with-resources 或者其他资源管理方式来手动释放资源。

C. finalize() 方法和 C++ 的析构函数是类似的概念,但不是完全一回事情。C++ 析构函数是在对象销毁时被调用,而 Java 的 finalize() 方法是在垃圾回收之前被调用。而且Java中的垃圾回收是由垃圾收集器自动管理的,而C++中需要手动调用析构函数来销毁对象。

D. 正确。在Java中,一个对象被判定为垃圾(不再被使用)的一个重要条件是没有引用指向它。当一个对象不再被任何引用指向时,它就成为垃圾,可以被垃圾收集器回收。但是线程的引用情况和对象不同,线程可以通过栈帧、全局静态变量等方式持有对象的引用,即使没有其他对象引用该对象,线程也可能持有它的引用,所以线程并非如此简单地被垃圾收集器判定为垃圾。
发表于 2023-08-04 08:51:45 回复(0)
1.在java中,对象的内存在什么时候回收,取决于垃圾回收器什么时候运行。 2.一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存 3.一个对象成为垃圾是因为不再有引用指着它,就可能被垃圾回收器回收,主线程开启一个线程,当主线程运行完成,没有引用指向运行的线程,但是开启的线程还在运行,直到run方法运行结束退出,这一点和对象的垃圾回收是不一样的。
发表于 2022-10-25 11:04:35 回复(0)
以前我是堆,你是栈
你总是能精准的找到我,给我指出明路
后来有一天我变成了栈,你却隐身堆海
我找不到你了,因为我丢失了方向(null)

我不愿意如此,在下一轮full gc前
我在Object的finalize()中
又找到了你,这次我不会放手

在世界重启前,我陪着你一起躲着full gc老去
发表于 2022-09-25 14:08:42 回复(0)
D在Java中,一个对象被判定为垃圾(不再被使用)的一个重要条件是没有引用指向它。当一个对象不再被任何引用指向时,它就成为垃圾,可以被垃圾收集器回收。但是线程的引用情况和对象不同,线程可以通过栈帧、全局静态变量等方式持有对象的引用,即使没有其他对象引用该对象,线程也可能持有它的引用,所以线程并非如此简单地被垃圾收集器判定为垃圾

发表于 2023-10-03 13:24:09 回复(0)
一个对象成为垃圾,是因为没有人去引用他.
成为垃圾后,等待垃圾回收器回收
垃圾回收时间取决于垃圾回收器的运行
垃圾回收之前首先调用finalize方法
finalize方法也可以主动调用
线程的释放是在run结束之后,此时的引用可能不存在
发表于 2023-02-26 10:20:28 回复(0)