我编写了一个与odbc交互并将消息提供给GUI的应用程序。出于某种原因,随着竞选活动的进行,javas内存使用量增长到超过1GB内存的非常大的数量。该应用程序很简单,不应该像这样运行内存...我认为,因为线程是如此繁忙而且没有被扼杀无论如何java没有机会释放它正在分配的内存,所以它不断变得越来越大。我想做的是在线程中的某个地方强制java释放内存。谁能告诉我怎么做?
感谢..
答案 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
中,尽管有许多方法可能会泄漏内存你不小心。)
第一步是分析堆以找出哪些对象不应该存在。您可以使用jhat,jvisualvm,各种分析器以及可能的其他工具。
以下问题可能有助于解决此问题:
答案 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