java - 如何改进应用程序以避免堆空间问题

标签 java object memory heap-memory

我有一个应用程序,它大量使用许多自定义对象,这些对象是在方法内部创建的,在方法之外从不需要。整个结构(在我看来)是非常好的面向对象的,并使用服务、实用程序和 DI 模型。

现在,当我运行第一个“大型”测试时,我很快遇到了 OutOfMemoryExceptions。现在,我不只是想增加堆空间并完成它,因为我可以想象这不会解决问题,而是延迟它直到我的应用程序增长更多并遇到同样的问题。

我正在寻找一些简单且易于实现的解决方案、技巧和片段,以帮助应用程序处理垃圾收集和堆空间,尤其是当涉及到许多与对象创建相关的循环时。

诸如“不要在循环中创建对象,在循环之前创建它们并在循环中覆盖它”之类的东西。

最佳答案

几点:

  • 增加堆空间从根本上没有错。不同的应用往往有不同的要求。
  • 使用探查器查看实际情况。例如在这里你可以找到堆分析器:MAT
  • 当您发现某个类的实例占 80% 的堆消耗时:
    • 尝试找到具有相同值的共同共享变量集。这些是可以被多个对象共享的一个对象的候选对象。
    • 特别检查您是否将一些对相对较大的对象图的引用存储到比循环生命周期长得多的变量(局部变量消耗堆栈)。
    • 让引用尽快脱离范围。
    • 如果您使用内部类,请检查那些不是静态的,因为非静态内部类持有对包含对象的引用。

关于java - 如何改进应用程序以避免堆空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533922/

相关文章:

java - 在不同的 fragment 中实现两个 RecyclerViews,但在同一个 Activity 中

java - 将内联元素列表直接反序列化为列表

python - 宇宙飞船对象

python - R 中的 numpy.memmap (Python) 等效吗?

java - Used vs Max vs Size -Jvisualvm?

java - 如何使用mybatis注释将简单数组插入表字段

java - Android 中任何线程中的异常为何以及如何导致整个应用程序崩溃

javascript - jQuery 对象 - 值 = 值 + 数字 - 不起作用?

javascript - 为特定结构JS的每个对象添加属性?

c++ - 是否可以从随后被破坏的字符串中本地保存数据而不将其移动到其他地方?