我正在基于Swing的Java应用程序上工作。而且我的应用程序将在内存中保存很多对象,这会导致“内存不足”错误。我知道我的代码在某个地方坏了,并且没有处理内存泄漏。

在分析应用程序时,为了进行研究,我编写了一个线程,该线程将在特定的时间间隔(例如,每3分钟)中调用System.gc(),这将大大减少JVM占用的内存。我确实知道,没有正确编写代码来清除未使用对象的引用,从而导致了这种现象。

我正在查看代码中的此类内存泄漏,但是仍然有两个问题,


我可以写这样一个线程请求垃圾回收吗?会损害我的申请吗?我接受,性能会降低,但不会比出现内存不足错误更糟。
除了创建线程之外,没有任何启动命令行参数会在给定的特定时间间隔内请求垃圾回收。


提前致谢 !!!

最佳答案

我确实知道,没有正确编写代码来清除未使用对象的引用,从而导致了这种现象。


实际上,这不是您看到的行为的正确解释。

您的代码要么发布引用,要么不发布引用。

结果,垃圾回收器将能够回收内存,或者将无法回收内存(无论尝试多长时间或多长时间运行一次)。

垃圾回收是在很长的时间间隔内进行的,在此期间您建立了大量“已用”内存是完全正常的。 Java在抱怨OutOfMemory错误之前会尽力回收内存。相反,如果仍有可用内存供您使用,它将不会非常努力。

因此,除非您看到由于GC花费的时间太长而导致的实际性能问题,否则我不会担心尝试对其进行调整。

如果看到的是OutOfMemory错误,则GC调整将无济于事。


  我可以写这样一个线程请求垃圾回收吗?会损害我的申请吗?我接受,性能会降低,但不会比出现内存不足错误更糟。


同样,这种权衡并不存在。您无法通过更频繁地运行GC来避免OOM。

是的,不必要的GC(这就是您要在此处执行的操作)会损害性能。

关于java - 用于垃圾收集的Java命令行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24158331/

10-12 00:34