从JTextArea删除Text后,堆不为空

时间:2013-01-27 16:53:37

标签: java swing heap profiler jtextarea

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

我对profiler不太熟悉,这是我在setText(null)之后在内存转储中看到的内容:

profiler snapshot

3 个答案:

答案 0 :(得分:4)

请阅读:How Garbage Collection works in Java

根据the docs System.gc()

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

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

NB - 反对的对象:这指的是所有不是static / final或正在使用/被任何其他实例/类/字段/变量等引用的对象

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

最佳答案如下:

  

每个人总是说避免System.gc()的原因是它是一个   从根本上打破代码的相当好的指标。任何代码   取决于它的正确性肯定会被打破;任何依赖它的人   性能很可能会被打破

并且甚至还提交了一个错误的文档错误提交错误:

答案 1 :(得分:4)

正如@DavidK所说,System.gc()并不是一种有用的方法来检验这一点。使用here描述的机制,大多数profilers可以强制进行垃圾收集,受某些limitations限制,是一种有用的调试工具。

答案 2 :(得分:2)

  1. 如果您的客户端程序中有任何String对象包含此内容,请将它们设置为null。

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

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