如何在java中销毁一个对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java中销毁一个对象?相关的知识,希望对你有一定的参考价值。

我在接受以下选项的采访中遇到了这个问题:

如何在java中销毁对象?

a. System.gc();  
b. Runtime.getRuntime.gc();  
c. object.delete();  
d. object.finalize();  
e. Java performs gc by itself, no need to do it manually.
  1. 答案应该是e?
  2. 如果e不存在怎么办?然后 ?显然c不是答案。 a和b将为整个应用程序执行gc(问题需要一个对象)。我认为这是因为在gc之前调用finalize()(但是在调用gc的最终化之后是否有必要?)或者我错了?我必须在那里回答这个问题吗?
答案

答案E是正确答案。如果E不存在,您很快就会耗尽内存(或)无正确答案。

无法访问对象以符合GC条件。 JVM将执行多次扫描并将对象从一代移动到另一代,以确定GC的合格性,并在无法访问对象时释放内存。

另一答案

澄清为什么其他答案不起作用:

  1. System.gc()(与Runtime.getRuntime().gc()一起完成同样的事情)暗示你想要破坏东西。依稀。如果JVM没有看到需要,那么JVM可以自由地忽略运行GC循环的请求。另外,除非您已经清除了对象的所有可访问引用,否则GC无论如何都不会触及它。所以A和B都被取消资格。
  2. Runtime.getRuntime.gc()语法不好。 getRuntime是一个函数,而不是变量;你需要用括号来调用它。因此B被双重取消资格。
  3. Object没有delete方法。所以C被取消资格。
  4. 虽然Object确实有finalize方法,但它不会破坏任何东西。只有垃圾收集器才能实际删除对象。 (在许多情况下,他们在技术上甚至不愿意这样做;他们只是在他们做其他人时不复制它,所以它被抛在后面。)所有finalize确实给了一个对象一个机会清理之前JVM丢弃它。更重要的是,你永远不应该直接打电话给finalize。 (由于finalize受到保护,JVM不会让你在任意对象上调用它。)所以D被取消资格。
  5. 除此之外,object.doAnythingAtAllEvenCommitSuicide()要求运行代码引用object。仅这一点使它“活着”,因此没有资格进行垃圾收集。因此C和D被双重取消资格。
另一答案

Short Answer - E

回答isE,其余的明显错误,但..

Long Answer - It isn't that simple; it depends ...

简单的事实是,垃圾收集器可能永远不会决定对每个对象进行垃圾收集,这是一个可行的收集候选对象,除非内存压力非常高。然而事实上,Java与其他任何语言一样容易受到内存泄漏的影响,它们更难以引起,因此当你导致它们时更难找到它们!

以下文章有许多关于内存管理如何工作和不起作用的详细信息,以及由什么引起的内容。 How generational Garbage Collectors workThanks for the Memory ( Understanding How the JVM uses Native Memory on Windows and Linux )

如果您阅读了这些链接,我想您会认为Java中的内存管理并不像多项选择问题那么简单。

另一答案

设为null。然后没有引用,该对象将有资格进行垃圾收集。 GC将自动从堆中删除Object。

另一答案

这是代码:

public static void main(String argso[]) {
int big_array[] = new int[100000];

// Do some computations with big_array and get a result. 
int result = compute(big_array);

// We no longer need big_array. It will get garbage collected when there
// are no more references to it. Since big_array is a local variable,
// it refers to the array until this method returns. But this method
// doesn't return. So we've got to explicitly get rid of the reference
// ourselves, so the garbage collector knows it can reclaim the array. 
big_array = null;

// Loop forever, handling the user's input
for(;;) handle_input(result);
}
另一答案

在java中,没有明确的方法来进行垃圾收集。 JVM本身在后台运行一些线程,检查没有任何引用的对象,这意味着我们访问对象的所有方式都将丢失。另一方面,如果对象超出了我们创建对象的程序终止或结束的范围,则该对象也有资格进行垃圾收集。回到你的问题,方法finalize与C ++中的析构函数相同。 finalize方法实际上是在JVM清除对象内存之前调用的。您可以在程序中定义finalize方法。但是,如果在程序终止后完成对象的垃圾收集,则JVM将不会调用您在程序中定义的finalize方法。你可能会问到finalize方法有什么用?例如,让我们考虑您创建了一个对象,该对象需要一些流到外部文件,并且您明确地为此对象定义了finalize方法,该方法检查打开到文件的流是否打开,如果不是,则关闭流。假设在编写了几行代码后,您丢失了对该对象的引用。然后它有资格进行垃圾收集。当JVM即将释放对象的空间时,JVM只会检查您是否定义了finalize方法并调用该方法,因此不存在打开的流的风险。 finalize方法使程序无风险且更加健壮。

以上是关于如何在java中销毁一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在销毁活动之前在视图寻呼机内的片段中执行某些操作

JAVA语言中用于投票器的代码如何写

如何确保在 Java 中销毁 String 对象?

Java线程池,从使用到原理

从使用到原理学习Java线程池

如何正确的创建和销毁 Java 对象?