本帖最后由 flowerjack 于 2012-08-16 14:47:18 编辑

解决方案 »

  1.   

    JVM只回收那些它认为是垃圾的内存空间,而Connection ResultSet占据的内存不被认为是垃圾内存。所以要手动清除。
      

  2.   

    JVM回收内存不是通过判断引用数来回收的吗?这些是特例?
      

  3.   

    貌似JDK1.7 不用自己关啦~~~
      

  4.   

    In some cases, it is desirable to immediately release a Connection's database and JDBC resources instead of waiting for them to be automatically released; the close method provides this immediate release.
      

  5.   

    就是说不关闭,JVM还是会回收的是吧,只是会过一段时间再回收.
      

  6.   

    如果有很多connection,你们都等着JVM自己处理,那还不卡死了
      

  7.   

    找到一篇文章解释得不错:
    Java 用的是可达性算法,而不是计算引用数.
    http://www.infoq.com/cn/articles/jvm-memory-collection
      

  8.   

    其实你可以不手动close 它,等到JVM也是一样的,但是问题在于你是数据库连接,
    这个连接是非常珍贵的,可能一次查询,就占了1~n个connection。整个网站这么多人访问,你不用完就释放,别人都连不上了!~这个才是原因了,JVM的垃圾回收机制你不确定什么时候发生。,
      

  9.   

    主动释放还是加快 Oracle /DB2 这些数据库端迟早释放。
    最早的时候, while(rs.next()) { 这是向数据库询问还有没有数据,如果数据库说有,这就返回 true,这时数据库可能保持一个 cursor 或类似的资源,每滚动到下一行,就向数据库请求数据一次。这种情况下不释放是有并发的性能问题。}后来的驱动程序会智能地缓存数据在客户端,但具体实现肯定每个数据库都不一样。如果等你把所有的事情都做完才关闭 Connection 时一并自动关闭 result set。你尝试在 for 循环中执行 SQL 上万次,得到的 resultset 都不关闭的话,Oracle 会告诉你 Cursor exhaused,游标已用完了。