例如这个redis,或者以前的conn,stat...等等他们不都是定义在方法里面的局部变量吗?当这个方法结束之后,他们不就弹出了吗,然后这个conn,或者statt所对应的实例就没有变量引用他们了,他们不就自动被jvm gc垃圾回收机制自动回收了呢
可是为什么我们还需要手动的去释放这些资源呢??求回答
解决方案 »
- 关于spring+hibernate多表查询的问题
- 这段代码有问题吗
- 数据库乱码问题
- jsp连接数据库问题
- 我想把显示数据的页面删除一条选中的记录,然后再在这个页面中显示出来,请问该怎么做呢?
- Hibernate + Spring save()时怎么能使用mysql的password()函数来加密
- 求省份、城市、地区选择JSP源码(SQL实现)
- Delphi 调取java写的webservice 问题
- 新手求教在此程序插入记录前加一查询条件!在线等待!
- JSP如何把文章内容提交进数据库,保持格式不变
- Java,LODOP打印,图片不显示的问题。
- Spring+stomp+websocket使用SimpMessagingTemplate推送消息,客户端订阅成功但收不到消息
2.jedis 是线程不安全的,创建连接,做相应操作后需要手动释放。
3.如果你谈到gc了,应该了解gc的发生时需要一定条件的,如果full gc发生,那么线上服务会暂时性停止相应,对用户不是很友好。所有有些资源从代码角度是需要手动释放的。
https://www.cnblogs.com/yikuan-919/p/9509071.html
你先要了解计算机系统的两个类型的资源,即内部资源和外部资源:
内部资源一般是指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对象等等。
GC又不会去管这些