我有一个应用程序,它大量使用许多自定义对象,这些对象是在方法内部创建的,在方法之外从不需要。整个结构(在我看来)是非常好的面向对象的,并使用服务、实用程序和 DI 模型。
现在,当我运行第一个“大型”测试时,我很快遇到了 OutOfMemoryExceptions。现在,我不只是想增加堆空间并完成它,因为我可以想象这不会解决问题,而是延迟它直到我的应用程序增长更多并遇到同样的问题。
我正在寻找一些简单且易于实现的解决方案、技巧和片段,以帮助应用程序处理垃圾收集和堆空间,尤其是当涉及到许多与对象创建相关的循环时。
诸如“不要在循环中创建对象,在循环之前创建它们并在循环中覆盖它”之类的东西。
最佳答案
几点:
- 增加堆空间从根本上没有错。不同的应用往往有不同的要求。
- 使用探查器查看实际情况。例如在这里你可以找到堆分析器:MAT
- 当您发现某个类的实例占 80% 的堆消耗时:
- 尝试找到具有相同值的共同共享变量集。这些是可以被多个对象共享的一个对象的候选对象。
- 特别检查您是否将一些对相对较大的对象图的引用存储到比循环生命周期长得多的变量(局部变量消耗堆栈)。
- 让引用尽快脱离范围。
- 如果您使用内部类,请检查那些不是静态的,因为非静态内部类持有对包含对象的引用。
关于java - 如何改进应用程序以避免堆空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533922/