以前在学校用C++的时候,还挺注意内存问题的,工作以来一直用Java,由于自己盲目相信Java的垃圾回收机制,所以从来不考虑内存释放的事,结果前几天就遇到问题了。
简单的说就是从数据库里读数据写到一个CSV文件里,由于数据量很大,老是报OutOfMemoryError的错,于是我就想肯定是因为数据库里的数据量太大了,我分批读取吧,于是在SQL语句里加了个Limit,结果呢?倒是能写了,可是只能写80万条,完了还是报OutOfMemoryError。
后来经过代码会审,明白了Java的垃圾回收机制是不靠谱的,虽然我每次读数据库都在循环中让先Statement对象=null,然后再读数据库,每次写CSV文件的时候也同样的让BufferedWriter对象=null,再去复用,但还是不可以的,因为Java回收机制是不定期回收,=null后是告诉Java这可以回收了,但是Java垃圾回收机制并不是立即回收的,因此就出现了我遇到的情况。
后来在每次循环的最后一句close一下相应的对象,问题就解决了。