返回信息流java 有了GC,告诉程序员当内存不够的时候GC会自动的回收、释放一些不要需要的内存。
往往给初学者(尤其是我)造成很大的误区:
java世界的里的内存是无限的! new 了对象之后就完全不需要考虑它的回收、释放。
而现实告诉我,这是绝对的错误的!
看两个例子:
1、使用JDBC,导致out of memory
有人认为是因为生成了非常多的connection,导致程序内存不足。但即使 在一个程序(单线程)里只使用一个connection,仍然会出现内存不足,原因是生成过多的 PreparedStatement (pstm), pstm的创建也是非常耗资源的,如果不手动关闭它,那只有等关闭connection时才能关闭(关闭connection时会关闭所有由该connection 创建出来的pstm). 所以当数据量较大时,即使只使用一个connection也会造成pstm的过多创建。
因此 程序员 就必须 :共用 pstm(和共用connection 一样)或者 适时手动关闭 pstm。
2、 使用runtime.exec("shell")
我在使用runtime运行shell convert (一个处理图片的程序)命令时,依然没有释放processor,当处理到300个图片时,出现了open too many files 的异常。使用top命令一看,居然有10个左右的convert进程在跑(崩溃了~~~~)。
后来发现:因为每个命令都有一个错误流(返回执行的结果),只有对这个错误流进行了处理,processor才能及时的释放。
例子1 告诉我们:
某个pstm即使不再使用,但只要创建该pstm的connection依然使用,GC是不会收回pstm。这和GC的原理是一样的。
所以我们在写程序时,就必须牢记这点,这是最基础也是最容易出错的,尤其是在一个大循环的情况下。
例子2 告诉我们:
在Java程序里,jvm只是其中的一部分,我们必须要考虑和jvm一起合作的其他部件。
比如例子2中的convert命令、unix文件系统。我们必须要知道用java和他们一起工作会出现什么问题。
比如:文件的连接数最多是多少? 在正常、异常情况下应该如何适时的关闭连接数?
比如:2003 sqlserver的本地连接数是多少(测试过一次,每循环一次就创建一次连接,循环了600多次,就无法再继续建立连接了),使用完connection后 就需关闭它 或者 使用 连接池 缓存起来。
所以使用java和其他组件合作时,就必须明白其他组件的一些硬性条件,而不能只生存在无限量内存的java 的虚拟环境中。
这是一条镜像帖。来源:北邮人论坛 / java / #3960同步于 2008/4/15
Java机器人发帖
[原创]难道Java里不需要手动释放内存?
Aaron12
2008/4/15镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。