Java内存清理

时间:2015-08-07 11:28:22

标签: java memory-management out-of-memory

我们为项目创建了自定义测试 - 自动化框架。这模仿了使用HTTP客户端的浏览器和服务器之间的交互(主要是在GET和POST请求中的json双向数据流)。

这很热,它发生了, 我们自动完成了大约1000个测试用例。测试用例执行包括创建大量的消息,因此产生大量的字符串;在获得验证结果后,反复读取大文件并验证内容并在其中丢弃所有内容。它适用于所有测试用例,需要15到20个小时。

问题在于,我们遇到了OutOfMemory错误。任何的想法?;清理从大文件读取和解析后消耗的内存100MB - 250MB。有很多分裂,替换,子串操作正在进行中。

请问,有人可以提供提示和建议吗?

- 提前谢谢

3 个答案:

答案 0 :(得分:3)

当由于内存空间不足而无法分配对象时,Java虚拟机(JVM)会抛出此错误,并且垃圾回收器无法释放一些空间。当禁用抑制和/或堆栈跟踪不可写时,JVM会创建OutOfMemoryError对象。

OutOfMemoryError的解决方案: 1。此错误最明显的解决方案是增加Java虚拟机的可用内存大小。如果您的应用程序需要更多内存,则应将其授予您的应用程序。

2。验证您的应用程序是否存储不必要的信息。仅存储和维护正确执行Java应用程序所需的那些信息。

3. 您可以使用可用内存分析器工具,以便仔细观察应用程序占用的内存部分。此类工具的示例是Eclipse Memory Analyzer(http://www.eclipse.org/mat/)和Java堆分析工具(jhat)(http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html)。

4. 尝试将JVM配置为使用更多内存,如前所示(-Xms750m -Xmx2048m -XX:MaxPermSize = 1024m)。

5. 启用垃圾收集日志记录(-Xloggc:/var/log/YOUR_APP/YOUR_APP-gc.log)并查看其行为方式,堆如何增长。可能你有内存泄漏。

6. 如果是这样,请使用HeapDump,使用YourKit打开它并查找使用最大内存量的对象。试着找出原因并解决它。

7. 您可以使用以下方法调用垃圾收集器:

System.gc();

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

JVM决定何时执行它。通常,如果JVM即将抛出OutOfMemoryError,则调用System.gc()将不会阻止它。更好地调查为什么你会泄漏这么多的内存并在整个过程中清理它。但这并不意味着它会立即执行。

有关如何使用Java SE 6调整垃圾收集的详细信息,请阅读有关JVM Garbage Collection Tuning SE 6 HotSpot的更多信息。

希望这对你有所帮助。

答案 1 :(得分:1)

通常,您应确保最大化可用于垃圾回收的对象。一种方法是在尽可能窄的范围内声明变量。 (例如:在try块内,使用方法局部变量)

您可能还需要increase Java heap size

答案 2 :(得分:0)

  

您可以明确地将对象设为null。

     

即使您可以致电System.gc();