gpt4 book ai didi

java - 内存增长无限制,垃圾收集器增加占用空间

转载 作者:行者123 更新时间:2023-11-29 03:46:45 25 4
gpt4 key购买 nike

所以我有一个创建大约 2000 个对象的应用程序。

对于每个对象,它下载一个网页(大约 75kb 的字符串),创建整个 html 树的 DOM 文档对象模型并丢弃字符串(它超出范围)。

然后它从 DOM 中提取一些文本和链接,并丢弃 DOM(通过将其设置为 null)。

在大约 1000 个对象之后(取决于我打开了多少应用程序,它可能在 50 个对象之后)我得到一个 OutOfMemory 异常,并且使用 Process Explorer 我可以看到内存占用一直在增加,以对数步长。

我尝试插入 System.gc(); 后将其设置为 null,但内存使用量仍在不断增加,但现在不是以对数步长而是在每个处理对象后以大约 0.5Mb 的步长.此外,在调试时,每当我跨过 System.gc() 时,足迹都会增加这个数量,并且它保持不变,直到指令指针位于相同的 System.gc() 再次。

[编辑]

我按照答案中的建议在转储上运行配置文件,发现每个类仍然存储一个 150kb 的字符串(75k 个字符)。总计 242mb。所以问题就变成了,如何在不保留原始字符串的情况下保留子字符串?显然,String 构造函数会执行此操作。

最佳答案

这看起来像是内存泄漏。我猜你不会在解析 HTML 后关闭 HTTP 连接或清理(?),但这只是猜测。您有两种选择来诊断问题:

  • 在出现内存不足错误时转储内存 (-XX:+HeapDumpOnOutOfMemoryError) 并使用内存分析器。它会告诉你什么占用了大部分内存

  • 尝试删除一些处理步骤(通过 HTTP 获取数据、解析 HTML、提取数据),看看没有哪一步内存增长会停止。此步骤会导致内存泄漏。

同时调用 System.gc() 永远也帮不了你。

关于java - 内存增长无限制,垃圾收集器增加占用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com