[問題] null 與 記憶體

作者: storypp (隨風而逝的是一份真)   2017-01-21 22:16:37
我在網路上找到一段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嗎?
作者: pan0438 (Libra)   2017-01-21 22:26:00
con後的close?
作者: dannypsnl (秦書)   2017-01-21 23:22:00
GC不保證回收時機,不然測測看兩個差異多大
作者: csieflyman (風之驕子)   2017-01-21 23:39:00
使用 Eclipse Memory AnalyzerÀ鄟eak
作者: ssccg (23)   2017-01-22 00:00:00
沒有差別...第一個寫法也沒有用完設null啊? 不懂你哪來這有差的想法方法結束,stack frame上的變數(reference)就沒了完全沒必要設null,指向的物件變成可GC,但不一定馬上GC個人覺得設完全不會用到的初始值是不好的寫法,唯一的效果是讓compiler提示用到未初始化變數的錯誤消失,然後說不定就因此沒發現會跑出NPE的執行路徑...
作者: ht5603 (Mike)   2017-01-22 00:49:00
可能是為了在catch exception處理,所以把變數宣告在try上面
作者: cowbaying (是在靠北喔)   2017-01-22 06:25:00
只要該變數不再被參照 就會被GC
作者: marsyang1 (Mars)   2017-01-22 08:39:00
兩個一樣
作者: jtorngl (Pedrosa go!)   2017-01-22 13:31:00
應該是該物件沒被reference,如果在此方法之外有其它變數還指向該物件,就算這個方法結束,GC執行時也不會清掉不過本文是不會,物件是在method中才建立的就是
作者: overxxx   2017-01-25 11:31:00
ResultSet/Statement需要close(),我通常會以try finally放在finally裡判斷不是null才做close

Links booklink

Contact Us: admin [ a t ] ucptt.com