JProfiler

用JProfiler如何区分内存溢出的种类。到底是因为数据太大,还是对象没有及时释放?

根据JVM垃圾回收原理啊,你需要深入了解这方面知识,无论“数据太大(只要不超过可用内存),还是对象没有及时释放”,只要对象不被引用,就能被垃圾回收机制回收。
[该贴被banq于2007年06月12日 10:20修改过]

终于有人回复了。
banq是这样的,其实就是有一个列表,列表中存很多条目,每点击一个条目,就会产生在个数据集(可能有很多数据)。在各个条目之间进行切换的时候,后台就会报内在溢出的错误。
一开始,我对她说,可能是对象引用没能及时的释放,所以才导致内存溢出。然后,我就用JProfiler查看系统运行时的Memory Views, Heap Walker, VM Telemetry Views。在条目切换时,VM Telemetry Views中显示内存增加的很快,从30M一下增到60M这样。但也不是一直在增长,如果不再切换条目,内增也就稳定下来了。但是如果,多切换几次,就报内存溢出。
在Memory Views查看其中涉及到的DataSet实例,也不多,就几个,而且也不大,就100K左右。我一开始以为,VM Telemetry Views中堆的数量增加,Memory Views也会相应的变大,但是变是变了,幅度非常的小。其中char[] 和 String实例最多。也是最大的。

>从30M一下增到60M这样
变大正常,如果执行GC,应该一下子缩小,如果就是执行GC,还是不停增大,就是存在内存泄漏。

执行了GC后,是变小了。说明内在应该没有泄漏。
但是,它仍会报出out of memory ,所以我就不懂了。难道就是因为数据量太大了吗?

启动应用程序时指定使用内存的参数试试

java -xms256m -xmx512m ...

>执行了GC后,是变小了。说明内在应该没有泄漏。
>但是,它仍会报出out of memory

两者矛盾的,GC后变小,是不是恢复到原来的大小,如果增大100,变小50,其实还是增大50,时间长了,能不out of memory ?

另外,在程序中,确定不要无限制一下子读取巨大数据,分批读取。

分批读取。数据是显示在swing的一个table里,我们没有实现分页。
[该贴被xinying_ge于2007年06月22日 19:18修改过]