[問題] null 與 記憶體

看板java作者 (隨風而逝的是一份真)時間8年前 (2017/01/21 22:16), 8年前編輯推噓4(4015)
留言19則, 9人參與, 最新討論串1/1
我在網路上找到一段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://www.ptt.cc/bbs/java/M.1485008200.A.305.html

01/21 22:26, , 1F
con後的close?
01/21 22:26, 1F
con使用完我會close 要用的時候再new 不過這在方法內 所以con的close不在這... ※ 編輯: storypp (114.35.252.180), 01/21/2017 23:13:31

01/21 23:22, , 2F
GC不保證回收時機,不然測測看兩個差異多大
01/21 23:22, 2F

01/21 23:39, , 3F
使用 Eclipse Memory AnalyzerÀ鄟eak
01/21 23:39, 3F

01/22 00:00, , 4F
沒有差別...
01/22 00:00, 4F

01/22 00:04, , 5F
第一個寫法也沒有用完設null啊? 不懂你哪來這有差的想法
01/22 00:04, 5F

01/22 00:05, , 6F
方法結束,stack frame上的變數(reference)就沒了
01/22 00:05, 6F

01/22 00:06, , 7F
完全沒必要設null,指向的物件變成可GC,但不一定馬上GC
01/22 00:06, 7F

01/22 00:09, , 8F
個人覺得設完全不會用到的初始值是不好的寫法,唯一的效果
01/22 00:09, 8F

01/22 00:11, , 9F
是讓compiler提示用到未初始化變數的錯誤消失,然後說不定
01/22 00:11, 9F

01/22 00:12, , 10F
就因此沒發現會跑出NPE的執行路徑...
01/22 00:12, 10F

01/22 00:49, , 11F
可能是為了在catch exception處理,所以把變數宣告在try上
01/22 00:49, 11F

01/22 00:49, , 12F
01/22 00:49, 12F
感謝大家的熱心回答,這樣看來我的想法應該沒問題, 結論就是 宣告的同時直接new 不需要先給null 方法結束時也不需要再指派null ※ 編輯: storypp (114.35.252.180), 01/22/2017 01:23:46

01/22 06:25, , 13F
只要該變數不再被參照 就會被GC
01/22 06:25, 13F

01/22 08:39, , 14F
兩個一樣
01/22 08:39, 14F

01/22 13:31, , 15F
應該是該物件沒被reference,如果在此方法之外有其它變數
01/22 13:31, 15F

01/22 13:32, , 16F
還指向該物件,就算這個方法結束,GC執行時也不會清掉
01/22 13:32, 16F

01/22 13:33, , 17F
不過本文是不會,物件是在method中才建立的就是
01/22 13:33, 17F

01/25 11:31, , 18F
ResultSet/Statement需要close(),我通常會以try finally
01/25 11:31, 18F

01/25 11:32, , 19F
放在finally裡判斷不是null才做close
01/25 11:32, 19F
文章代碼(AID): #1OWsr8C5 (java)
文章代碼(AID): #1OWsr8C5 (java)