作者storypp (随风而逝的是一份真)
看板java
标题[问题] null 与 记忆体
时间Sat Jan 21 22:16:37 2017
我在网路上找到一段code
public void selectAll(Connection con, String tableName) throws SQLException {
String sql = "select * from " + tableName;
Statement stat = null;
ResultSet rs = null;
stat = con.createStatement();
rs = stat.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
}
}
我想改为
public void selectAll(Connection con, String tableName) throws SQLException {
String sql = "select * from " + tableName;
Statement stat = con.createStatement;
ResultSet rs = stat.executeQuerty(sql);
while (rs.next()) {
System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
}
}
我在执行的时候,感觉并没有差异,
但是我想了解一下,原本的写法是不是对记忆体释放比较友善?
因为我自己写的程式常常跑一段时间後,占用的记忆体越来越大,
怀疑是不是我都没有适时指定为null?
可是这个只是一个方法,方法执行结束,
不是就应该会释放记忆体了吗?
有必要特别再针对方法内的变数指派null吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.35.252.180
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1485008200.A.305.html
1F:推 pan0438: con後的close? 01/21 22:26
con使用完我会close 要用的时候再new
不过这在方法内 所以con的close不在这...
※ 编辑: storypp (114.35.252.180), 01/21/2017 23:13:31
2F:→ dannypsnl: GC不保证回收时机,不然测测看两个差异多大 01/21 23:22
3F:推 csieflyman: 使用 Eclipse Memory AnalyzerÀ鄟eak 01/21 23:39
4F:→ ssccg: 没有差别... 01/22 00:00
5F:→ ssccg: 第一个写法也没有用完设null啊? 不懂你哪来这有差的想法 01/22 00:04
6F:→ ssccg: 方法结束,stack frame上的变数(reference)就没了 01/22 00:05
7F:→ ssccg: 完全没必要设null,指向的物件变成可GC,但不一定马上GC 01/22 00:06
8F:→ ssccg: 个人觉得设完全不会用到的初始值是不好的写法,唯一的效果 01/22 00:09
9F:→ ssccg: 是让compiler提示用到未初始化变数的错误消失,然後说不定 01/22 00:11
10F:→ ssccg: 就因此没发现会跑出NPE的执行路径... 01/22 00:12
11F:→ ht5603: 可能是为了在catch exception处理,所以把变数宣告在try上 01/22 00:49
12F:→ ht5603: 面 01/22 00:49
感谢大家的热心回答,这样看来我的想法应该没问题,
结论就是 宣告的同时直接new 不需要先给null
方法结束时也不需要再指派null
※ 编辑: storypp (114.35.252.180), 01/22/2017 01:23:46
13F:推 cowbaying: 只要该变数不再被参照 就会被GC 01/22 06:25
14F:→ marsyang1: 两个一样 01/22 08:39
15F:→ jtorngl: 应该是该物件没被reference,如果在此方法之外有其它变数 01/22 13:31
16F:→ jtorngl: 还指向该物件,就算这个方法结束,GC执行时也不会清掉 01/22 13:32
17F:→ jtorngl: 不过本文是不会,物件是在method中才建立的就是 01/22 13:33
18F:推 overxxx: ResultSet/Statement需要close(),我通常会以try finally 01/25 11:31
19F:→ overxxx: 放在finally里判断不是null才做close 01/25 11:32