我们的一个项目有时会得到一个 OutOfMemory在一个用户的计算机上出错,但当然不是在我测试它时.我只是用JProfiler运行它(在10天的评估许可证上,因为我之前从未使用它),并且对我们的代码前缀进行过滤,总大小和实例数量中最大的块是特定简单类的8000多个实例.
我点击了JProfiler上的"Garbage Collect"按钮,我们其他类的大部分实例都消失了,但不是这些特殊的.我再次运行测试,仍然在同一个实例中,它创建了4000多个类的实例,但是当我点击"垃圾收集"时,那些离开了8000多个原始实例.
这些实例在各个阶段都会遇到各种集合.我认为它们不是垃圾收集的事实必然意味着某些东西持有对其中一个集合的引用,以便保持对对象的引用.
有什么建议我如何弄清楚什么是持有参考?我正在寻找在代码中寻找什么的建议,以及如果有的话在JProfiler中找到它的方法.
嗯.Java中的内存使用是否有任何入门?我本以为Sun或IBM本来会有一篇关于这个主题的好文章,但我找不到任何看起来非常可靠的文章.我有兴趣了解两件事:
我可能已经创建了数十万个对象,我想成为一个"好邻居",不要过度浪费RAM.我的意思是我并不在乎我是否比"最佳情况"(无论是那种情况)使用的内存多10%,但是如果我实现了一些使用5倍内存的东西,如果我做了一个简单的话改变,我想使用更少的内存(或者能够为固定数量的可用内存创建更多对象).
我发现了一些文章(Java专家的时事通讯和来自Javaworld的东西)和内置类java.lang.instrument.getObjectSize()之一声称测量内存使用的"近似"(??),但这些似乎都是有点模糊......
(是的,我意识到在两个不同的操作系统上运行的JVM可能会为不同的对象使用不同的内存量)