java内存使用无法释放

时间:2010-12-07 09:23:43

标签: java core

我编写了一个与odbc交互并将消息提供给GUI的应用程序。出于某种原因,随着竞选活动的进行,javas内存使用量增长到超过1GB内存的非常大的数量。该应用程序很简单,不应该像这样运行内存...我认为,因为线程是如此繁忙而且没有被扼杀无论如何java没有机会释放它正在分配的内存,所以它不断变得越来越大。我想做的是在线程中的某个地方强制java释放内存。谁能告诉我怎么做?

感谢..

6 个答案:

答案 0 :(得分:2)

尝试使用visualVM(包含在JDK6中)或eclipse TPTP

之类的分析器

作为起点:您是否关闭所有语句和结果集?使用mysql,我遇到了使用JDBC驱动程序的memoryleek。

答案 1 :(得分:2)

你无法强制jvm释放内存。您的应用程序只是内存泄漏。您必须使用java profiler(例如jdk中的jvisualvm)来查找这些泄漏。

答案 2 :(得分:1)

您不能强制java释放内存,您只能通过System.gc()建议。但我认为这不是你的主要问题。我建议您使用Eclipse MAT来分析您的应用程序,这是一个易于理解的内存分析器。如果你发现你的内存泄漏发布在这里,那么我们就可以看到我们如何解决它。

答案 3 :(得分:1)

Java只能为程序不再引用(即使用中)的对象释放内存。并且,一旦一个对象不再被引用,它将被相当快速地清理(尽管以某种方式超出了直接控制)。

这可能很简单memory leak。您需要分析内存以查看哪些对象不应该存在,然后确定为什么垃圾收集器认为它们仍然可以访问。在您的代码中的某个时刻,您将无法释放不再需要的这些变量(例如,将它们放在Map中,尽管有许多方法可能会泄漏内存你不小心。)

第一步是分析堆以找出哪些对象不应该存在。您可以使用jhatjvisualvm,各种分析器以及可能的其他工具。


以下问题可能有助于解决此问题:

答案 4 :(得分:0)

您不能强制java释放内存,但您可以使用以下命令来执行此操作:

System.gc()

随着时间的推移,您看到内存使用量逐渐增加的事实表明内存泄漏,并且没有任何调用System.gc将释放内存。查看上面提到的一些分析工具,并使用它们来跟踪内存使用情况。

答案 5 :(得分:0)

取决于JVM,例如Oracle的JRockit可以在命令行上配置压缩方案:

http://download.oracle.com/docs/cd/E15289_01/doc.40/e15062/optionxx.htm#BABGFFID