例如这个redis,或者以前的conn,stat...等等他们不都是定义在方法里面的局部变量吗?当这个方法结束之后,他们不就弹出了吗,然后这个conn,或者statt所对应的实例就没有变量引用他们了,他们不就自动被jvm gc垃圾回收机制自动回收了呢
可是为什么我们还需要手动的去释放这些资源呢??求回答

解决方案 »

  1.   

    你访问一次的时候可能没事 但是你要是访问一百万次呢  你不释放jdbc资源 那就炸了
      

  2.   

    jvm不是会帮我们自动回收吗
      

  3.   

    还是自己再顶一下吧,或者java垃圾回收机制,比较慢,如果在高并发的情况下,等到jvm来回收 的话,性能就太低了,所以需要自己手动回收???
      

  4.   

    你自己试一下用循环访问你的jdbc,不释放资源,看jvm会回收不
      

  5.   

    访问的多了,那jdbc就炸了,卡死了,会访问不了
      

  6.   

    1.你的redis servier是有最大链接数限制的,如果没有手动及时释放链接 ,会造成其他client无法链接,
    2.jedis 是线程不安全的,创建连接,做相应操作后需要手动释放。
    3.如果你谈到gc了,应该了解gc的发生时需要一定条件的,如果full gc发生,那么线上服务会暂时性停止相应,对用户不是很友好。所有有些资源从代码角度是需要手动释放的。
      

  7.   

    1)释放资源,不是释放jvm中占用的内存空间,而是服务端的连接资源2)jedis客户端连接redis,如果不手动释放,redis连接不会断掉。redis服务端资源被占用3)下面的链接解释了jdbc 链接数据库为什么要释放connection
    https://www.cnblogs.com/yikuan-919/p/9509071.html
      

  8.   

    不关闭jdbc线程一直开着,不浪费资源,给服务器造成压力吗
      

  9.   

    11楼说了重点,另外补充一下:
    你先要了解计算机系统的两个类型的资源,即内部资源和外部资源:
    内部资源一般是指cpu资源和内存资源,cpu资源会被操作系统调度控制,一般不需要应用程序自己操心,内存资源需要应用程序来操心回收,如果你使用C或者C++之类的语言,你就要操心这种事情,而java使用自动回收机制来帮你操心这一部分资源了,所以你不需要你操心了。所以jvm的自动内存回收只是负责内存资源的回收和释放。
    除了cpu资源和内存资源,其余资源全部是外部资源,外部资源包含磁盘资源、网络资源、存储资源、以及其他接口资源,例如打印机、显示器、扫描仪、U盘等等等。这些外部资源jvm都不会帮你管理,你用java应用程序占用掉这些资源以后你都要手动释放,一般来说任何调用这些资源的api都会有close方法来给你使用,就目前java版本来说(jdk1.8以后),这些资源占用API都会实现AutoCloseAblej接口(老的api可能不会有这个实现),任何一个实现这个接口的方法都有一个自动释放资源的调用方式,如代码:try(AutoCloseAble close=xxxxx.getResource()){
    //你的业务逻辑.....
    }catch(Exception e){
    //异常处理逻辑....
    }在try中声明的AutoCloseAble对象都会在try执行块完成以后自动释放(自动调用close方法)。
    例如InputStream对象 jdbc的Connection对象以及网络请求的HttpConnection对象等等。
      

  10.   

    我建议好好学学JAVA的GC机制
    GC又不会去管这些