Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 以上是OutOfMemoryErr 产生的原因,一是不能对象定位,二是没有空间给垃圾收集器。所以,解决这个问题的根本是从原因二着手解决。也就是说,在返回记录的时候,不妨采取分页提取技术,减少内存的开销,同时也提高运行效率。
我感觉程序就象死机了一样,没响应了!
首先查询所有的主键,这个的数据量通常不是很大,就算主键为LONG类型,100万条记录,我们来计算一下需要多大的存储空间:8 bytes * 1,000,000 = 8,000,000 bytes。 8M而已。
你缓存所有的主键,然后采用步进的方式进行查询,每次2000条结果返回,直到所有的缓存的主键都查询完成就结束。
这样的做法是大大增加了你访问数据库的SELECT执行次数,但是实验可以证明通过唯一索引来访问数据库记录的性能损失是极低的。这点在通常情况下不会作为瓶颈出现。为了解决你的问题,这样的代价还是非常值得付出的。
如果你有一个缓冲区,当在抛出OutOfMemoryError的某处捕获它,并在错误处理中清空该缓冲区。
某些情况下,也可以这样实现。
如果你有一个缓冲区,当在抛出OutOfMemoryError的某处捕获它,并在错误处理中清空该缓冲区。
>>
I服了U了。
别笑我,作为某些应用或服务器设计是可以这样实现的,不要拒绝另一种思路嘛,我只针对OutOfMemoryError。
当然对于数据库应用,这样做并不合适,我认为你的建议就很好。 例:
try {
//循环处理arrayList.add(xxx);
} catch (OutOfMemoryError e) {
arrayList.clear();
}
呵呵,玩笑而已。别计较。
通常情况下俺是拒绝使用Exception来介入正常的流程控制的。
>>quot----------------------------------------------------
回复人: chesterwoo() ( ) 信誉:98 2003-11-21 16:27:00 得分:0
某些情况下,也可以这样实现。
如果你有一个缓冲区,当在抛出OutOfMemoryError的某处捕获它,并在错误处理中清空 该缓冲区。
>>-------------------------------------------------------
这里提到的方法应该行不通;OutOfMemoryError属于error,捕获error是没有意义的,应为在该情形下JVM要停机,根本不可能在抛出了一个error后再通过程序来恢复出错前的状态; 只能从预防该错误的角度来思考该问题。
一般来说捕获error是没有意义的,但并不是任何时候都不能使用。
OutOfMemoryError是Error,也是Throwable的一个子类,所以可以捕获。在网上应该可以找到示例代码。因为我们一般只捕获exception并不处理error,所以当出现error时,系统会崩溃。这种方法应该可以在服务器之类程序设计中出现。不过在这讨论有点离题。还是请大家关注主题吧。
文件,可以用多线程分段导,当然也的限制数据量。
如果是另一个数据库,ORACLE的imp exp命令比较好用
如果是页面显示的话,呵呵,不必一次线是这么多吧。