所以我有一个应用程序可以创建 2000 个对象。
对于每个对象,它下载一个网页(大约 75kb 的字符串),创建整个 html 树的 DOM 文档对象模型并丢弃字符串(超出范围)。
然后它从 DOM 中提取一些文本和链接,并丢弃 DOM(通过将其设置为 null)。
在大约 1000 个对象之后(取决于我打开了多少应用程序,可能是在 50 个对象之后),我得到了 OutOfMemory 异常,并且使用 Process Explorer 我可以看到内存占用量一直在以对数步长增加。
我尝试在将其System.gc();
设置为 null 后插入 a,但内存使用量仍在不断增加,但现在不是使用对数步长,而是在每个处理对象后使用大约 0.5Mb 的步长。此外,在调试时,每当我越过System.gc()
足迹时,足迹就会增加这个数量,并且它保持不变,直到指令指针System.gc()
再次相同。
[编辑]
我按照答案中的建议在转储上运行了配置文件,发现这些类中的每一个仍然存储一个 150kb 字符串(75k 个字符)。总计 242mb。所以问题就变成了,如何在不保留原始字符串的情况下保留子字符串?显然 String 构造函数就是这样做的。