0

我有一个带有 AWT GUI 的应用程序,JTextArea用于记录输出。setText(null)如果我用or removeAll()or擦除文本setText("")然后运行垃圾收集器System.gc(),我注意到整个文本仍在内存中。我怎样才能真正删除文本?

我对探查器不是很熟悉,这是我在内存转储中看到的内容setText(null)

探查器快照

4

3 回答 3

4

请阅读:垃圾收集如何在 Java中工作。

根据文档 System.gc()

调用 gc 方法表明Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间

NB-建议。这意味着垃圾收集器只建议进行清理而不是强制它也可能完全忽略您的请求,因此我们无法知道垃圾何时会被收集,只能及时收集。

NB -废弃对象:这是指所有其他实例/类/字段/变量等未static/或正在使用/引用的所有对象。final

这也是我在该主题上发现的一个有趣的问题:

最佳答案如下:

每个人总是说要避免的原因System.gc()是,它是一个很好的指标,表明代码根本上是有问题的。任何依赖它来保证正确性的代码肯定会被破坏;任何依赖它来实现性能的东西都很可能被破坏

甚至还提交了一个错误的文档措辞错误:

.

于 2013-01-27T17:12:34.910 回答
4

正如@DavidK 指出System.gc()的那样,这不是检查这一点的有用方法。使用此处描述的机制,大多数分析器可以强制垃圾收集,但受到一些限制,是一种有用的调试工具。

于 2013-01-27T18:47:55.787 回答
2
  1. 如果您的客户端程序中有任何 String 对象包含此内容,请将它们也设置为 null。

  2. 此外,您不需要显式调用 System.gc() 方法。当 JVM 需要更多内存来分配给其他对象时,它会垃圾收集孤立对象。

  3. 您只需要担心是否看到内存不足/连续堆内存增加使用等。

于 2013-01-27T17:25:40.177 回答