我有一个应用程序,它与许多在方法中创建的自定义对象一起工作,并且从不需要在它们之外.整个结构(在我看来)非常好的面向对象,并使用服务,实用程序和DI模型.
现在,当我运行我的第一个“大型”测试时,我很快遇到了OutOfMemoryExceptions.现在,我不只是想增加堆空间并完成它,因为我可以想象这不会解决问题,而是延迟它直到我的应用程序增长更多并遇到同样的问题.
我正在寻找一些简单易用的解决方案,技巧和片段,它们可以帮助应用程序处理垃圾收集和堆空间,尤其是涉及许多使用对象创建操作的循环时.
像“不要在循环中创建对象,在循环之前创建它们并在其中覆盖它”之类的东西.
解决方法
我将首先使用jvisualvm(JDK的一部分)分析您的应用程序并查找内存热点.这将为您提供并指示您的对象有多大以及哪些方法调用导致高内存使用.它还会告诉你对象在内存中持续多长时间,这通常是一个很好的起点,因为你希望将范围缩小到尽可能短.
下一步是通过改进设计或实现缓存来识别对象中的共性.如果您正在从固定存储中加载数据,那么您可以使用软引用,这样当JVM用完堆时,这些对象将被GC(如果您对这些对象进行更改,则显然需要在删除硬引用之前保留它们).然后,如果再次需要它们,您的应用程序将只需要从后备存储(DB,文件或其他)重新加载它们.
确保您了解GC的工作原理并了解对象引用:
>强/直接
>柔软
>弱
>幽灵
这里有一些很好的文章解释了参考文献和GC:
http://www.java-tips.org/java-se-tips/java.util/using-weakhashmap-for-listener-lists.html