Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java垃圾收集器澄清_Java_Garbage Collection - Fatal编程技术网

Java垃圾收集器澄清

Java垃圾收集器澄清,java,garbage-collection,Java,Garbage Collection,现在我正在阅读这篇关于Java垃圾收集的文章: 下面是JMS客户机中的函数片段 public void foo(){ ...//Create Connection factory, connection, and session, topic TopicSubscriber tp = session.createDurableSubcriber(topic,"001"); tp.setMessageListener(this) } 这个问题不是关于JMS的,而是关于f

现在我正在阅读这篇关于Java垃圾收集的文章:

下面是JMS客户机中的函数片段

public void foo(){
    ...//Create Connection factory, connection, and session, topic

    TopicSubscriber tp = session.createDurableSubcriber(topic,"001");
    tp.setMessageListener(this)
}

这个问题不是关于JMS的,而是关于foo()函数调用结束后对象“tp”发生了什么。函数结束后,就无法再引用tp了。我假设createDurableSubscriber()中使用了关键字“new”,这意味着对象被放置在JVM堆上。但是,由于tp不能再被引用,它是否受JVM垃圾收集的影响?

可能。它可能仍然通过从某个静态变量开始的指针链被引用。

可能。它仍然可以通过从某个静态变量开始的某个指针链引用。

它可以在会话中作为字段引用,或者根据JMS实现传递到其他任何地方。 JMS只是一个API,您不能简单地假设关于实现的任何事情,也不能假设不再引用
tp


但是为了回答这个问题,如果您“假设”它没有被引用,那么GC会处理它。

它可以在会话中作为字段引用,或者根据JMS实现传递到任何其他地方。 JMS只是一个API,您不能简单地假设关于实现的任何事情,也不能假设不再引用
tp


但是为了回答这个问题,如果你“假设”它无论如何都没有被引用,那么GC会处理它。

只有在运行的代码没有引用的情况下才会收集对象(不包括弱引用,很少有人会处理它——弱引用不算作确定可收集性)

在您的示例中,如果您假设
create…
实际上创建了一个新对象,并且由于某种原因没有存储对它的引用,并且将侦听器附加到所述对象不需要创建回可观察对象的链接,那么yes--
tp
可能有资格进行终结和收集


但是,如果这些假设中的任何一个都是错误的,那么所有的赌注都是无效的。

只有在运行中的代码没有对对象的引用时才会收集对象(不包括弱引用,通常很少有人会处理它——弱引用不算作确定可收集性)

在您的示例中,如果您假设
create…
实际上创建了一个新对象,并且由于某种原因没有存储对它的引用,并且将侦听器附加到所述对象不需要创建回可观察对象的链接,那么yes--
tp
可能有资格进行终结和收集


但是,如果这些假设中的任何一个都是错误的,那么所有的赌注都是无效的。

您需要查看
会话的源代码。createDurableSubcriber()
以查看它是否没有存储它将返回给您的值


请记住,您基本上得到的是指向对象的指针(在Java中称为引用),而不是对象本身,而且即使只有一个对象,指针也可以存储在许多地方。在垃圾回收器回收对象之前,必须完成所有这些指针引用。

您需要查看会话的源代码。createDurableSubcriber(),查看它是否未存储它将返回给您的值


请记住,您基本上得到的是指向对象的指针(在Java中称为引用),而不是对象本身,而且即使只有一个对象,指针也可以存储在许多地方。在垃圾收集器回收对象之前,必须使用所有这些指针引用。

区分对象和变量(其中包含对对象的引用)很重要。当对象不再有引用时,该对象就有资格进行垃圾收集


在您的特定情况下,
createDurableSubscriber
将保留它返回的引用的副本,从而防止收集对象。(毕竟,当新消息到达时,它需要调用该对象上的方法,这在没有引用的情况下很难做到),

区分对象和变量(其中包含对对象的引用)很重要。当对象不再有引用时,该对象就有资格进行垃圾收集


在您的特定情况下,
createDurableSubscriber
将保留它返回的引用的副本,从而防止收集对象。(毕竟,当新消息到达时,它需要调用该对象上的方法,这在没有引用的情况下是很难做到的),

因此,我想没有办法确定,除非您查看您使用的API的源代码,或者您是否信任API开发人员。或者信任API。如果你已经使用完某个东西,你可以忘记它(只是失去你的参考资料)。当应用程序的其余部分也这样做时,对象就是垃圾。如果您希望以后能够使用
tp
做一些事情,请保留它。否则,让API和GC关心如何处理它。他们通常很擅长做正确的事情。我问这个问题的一个重要原因是因为我在一个教程中看到了这段代码,所以如果API没有删除引用,开发人员在完成引用后怎么知道如何删除它呢?当您不再需要它时,您只需删除对对象的所有引用。JVM将保持全局计数,因此您不必担心。因此,我想没有办法确定,除非您查看您使用的API的源代码……准确地说,或者如果您信任API开发人员,或者信任API。如果你已经使用完某个东西,你可以忘记它(只是失去你的参考资料)。当应用程序的其余部分也这样做时,对象就是垃圾。如果你关心能用