Java内存清理

标签 java memory-management out-of-memory

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

这里很热,它发生了, 我们有大约 1000 个自动化测试用例。测试用例执行涉及创建大量消息,从而创建大量字符串;重复读取大文件并验证内容,并在得到验证结果后当然扔掉所有内容。它适用于所有测试用例,需要 15 到 20 小时。

问题是,我们遇到了内存不足错误。任何想法?;清理从 100MB - 250MB 大文件读取和解析后消耗的内存。正在进行大量的拆分、替换、子字符串操作。

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

-提前致谢

最佳答案

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

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();

当调用垃圾收集器方法时,表明Java虚拟机会努力回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控制权从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。

JVM 决定何时执行它。一般来说,如果 JVM 将抛出 OutOfMemoryError,调用 System.gc() 不会阻止它。更好地调查为什么会泄漏这么多内存并一路清理它。但这并不意味着它会立即执行。

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

希望这对您有帮助。

关于Java内存清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876629/

相关文章:

java - 如何超越LogManager警告?

c - "cacheline aligned"是什么意思?

java - JavaFX 中使用 Lambda 表达式的键绑定(bind)不起作用

java org.json 比较对象

c++ - 重载删除和检索大小?

c# - .NET framework 如何为 OutOfMemoryException 分配内存?

java - 视频文件加密?

android - 使用 Glide 加载大尺寸图像时出现 OutOfMemoryException

java - Java 中的 CSVWriter 编码

mysql - 数据库内存和磁盘工作分配