当前位置: 首页 > 知识库问答 >
问题:

垃圾收集器会导致内存泄漏吗?

戚衡
2023-03-14

如果我有一个垃圾收集器来跟踪分配的每个对象,并在它们不再有对它们的可用引用时立即释放它们,你还会有内存泄漏吗?

考虑到内存泄漏是指没有任何引用的分配,这不是不可能的吗?还是我遗漏了什么?

编辑:所以我认为内存泄漏是您在代码中不再引用的分配。您仍然可以引用的大量累积分配不是我在这里考虑的泄漏。

我也只是在谈论普通的G.C.,已经有一段时间了,但我知道像html" target="_blank">循环引用这样的案例不会把他们绊倒。我不需要任何语言的具体答案,这只是来自我和一个朋友的一次对话。我们讨论的是Actionscript和Java,但我不想给出具体的答案。

Edit2:从听起来,似乎没有任何原因表明代码可以完全失去引用分配的能力,也没有GC能够获取分配,但我仍在等待更多的信息。

共有3个答案

西门经国
2023-03-14

内存泄漏不仅仅取决于垃圾收集算法的效率,如果您的程序保留有很长生命周期的对象引用,例如在实例变量或静态变量中没有使用,那么您的程序将存在内存泄漏。

引用计数存在循环引用含义的已知问题

Object 1 refers to Object 2 and Object 2 refers to Object 1 

但没有其他人引用对象1或对象2,在这种情况下,引用计数算法将失败。

由于您正在处理垃圾收集器本身,因此有必要阅读不同的实现策略。

慕健
2023-03-14

要确定程序是否存在内存泄漏,必须首先定义泄漏是什么。如果存在某种状态和一系列输入,我会将程序定义为存在内存泄漏:

  1. 如果程序处于状态'S',并且它接收到输入'I',它仍将处于状态'S'(如果它没有崩溃),但是

完全在垃圾回收框架中运行的程序绝对有可能出现上述定义的内存泄漏。发生这种情况的一种常见方式是事件订阅。

假设线程安全集合公开了CollectionModified事件,并且IEnumerator

龙正初
2023-03-14

如果你的问题是:

考虑到内存泄漏是指没有任何引用的分配,这不是不可能的吗?还是我遗漏了什么?

那么答案是“是的,这是不可能的”,因为正确实现的垃圾收集器将回收所有没有活动引用的分配。

然而,在(例如)Java中肯定会出现“内存泄漏”。我对“内存泄漏”的定义是一种分配,它仍然有一个活动引用(这样它就不会被垃圾回收器回收),但程序员不知道该对象是不可回收的(即:对于程序员来说,这个对象是死的,应该回收)。一个简单的例子如下:

对象A-

在本例中,ObjectA是代码中正在使用的对象。然而,ObjectA包含一个对ObjectB的引用,该引用实际上是死的(即:ObjectB已经分配和使用,从程序员的角度来看,现在是死的),但程序员忘记了将ObjectA中的引用设置为null。在这种情况下,ObjectB已“泄漏”。

听起来不是什么大问题,但在某些情况下,这些泄漏是累积的。让我们假设ObjectA和ObjectB实际上是同一类的实例。每次使用这样的实例时,程序员忘记将引用设置为null的问题都会发生。最终你会得到这样的结果:

对象A-

现在ObjectB到ObjectH都泄漏了。这样的问题最终会导致程序崩溃。即使使用正确实现的垃圾收集器。

 类似资料:
  • 在面对中的一些内存泄漏后,我想知道中是否存在内存泄漏。快速搜索将我带到了以下stackoverflow线程。 @david wasser对此帖子的评论如下: 对象a- 在本例中,ObjectA是代码中正在使用的对象。然而,ObjectA包含一个对ObjectB的引用,该引用实际上是死的(即:ObjectB已经分配和使用,从程序员的角度来看,现在是死的),但程序员忘记了将ObjectA中的引用设置为

  • 我有一些和等,但是我没有设置。你觉得会是那样吗? 你有什么想法或建议吗? PS:该应用程序在Ubuntu机器上运行 多谢.

  • 问题:正在退出本机内存异常,并想知道过多的垃圾收集是否会导致这种情况?此外,关于GC策略或调优的任何建议都会有所帮助。我不确定我所拥有的是否值得改变。 好的参考StackOverflow问题:使用哪个GC策略 规格: 服务器环境:Websphere版本7 初步分析: 我假设内存泄漏,但是垃圾回收看起来可以回收内存 附加屏幕截图: 堆利用率为1.1-4小时。每个绿色小垃圾桶代表一个主要的垃圾回收机制

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 问题内容: 这是我几个月来一直试图寻找的问题。我有一个运行的Java应用程序,它处理xml提要并将结果存储在数据库中。存在间歇性的资源问题,很难追踪。 背景: 在生产包装盒上(问题最明显的地方),我对包装盒的访问不是特别好,并且无法使Jprofiler运行。那个盒子是一个运行centos5.2,tomcat6和java 1.6.0.11的64位四核8GB计算机。它以这些java-opts开头 技术

  • 我正在玩rxjava,发现如果在活动被销毁之前没有完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅没有取消订阅,则此类情况的演示之一如下所示。已销毁(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions