none
VB2008 中 System.OutOfMemoryException 的解決方法 RRS feed

  • 問題

  • 小弟目前測試程式發現再執行寫入資料庫動作時 ,一段時間後便會發現 OutOfMemoryException 這個異常
    檢視PF使用量累積到2.2G左右
    目前約每秒寫入3筆
    在MODULE中建立一段資料庫語法:

     Public Function ALM_SET(ByVal MSG As String)
            Dim SqlConn As OleDbConnection
            Dim mycom As OleDbCommand
            ALM_IN_DAY = Now.Date
            ALM_IN_TIME = Now.Hour & ":" & Now.Minute
            Dim STR As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\PLCALM.mdb;User ID=Admin;Password=;"
            SqlConn = New OleDbConnection(STR)
            SqlConn.Open()
            Dim Sqlstr As String = "Insert Into report1(S_SDAY,S_STIME,S_COMM,S_ETIME,S_USER)  values (@S_SDAY,@S_STIME,@S_COMM,@S_ETIME,@S_USER) "
            mycom = New OleDbCommand(Sqlstr, SqlConn)
            mycom.Parameters.Add(New OleDbParameter("@S_SDAY", OleDbType.Char))
            mycom.Parameters.Add(New OleDbParameter("@S_STIME", OleDbType.Char))
            mycom.Parameters.Add(New OleDbParameter("@S_COMM", OleDbType.Char))
            mycom.Parameters.Add(New OleDbParameter("@S_ETIME", OleDbType.Char))
            mycom.Parameters.Add(New OleDbParameter("@S_USER", OleDbType.Char))
            mycom.Parameters("@S_SDAY").Value = Format(ALM_IN_DAY)
            mycom.Parameters("@S_STIME").Value = Format(ALM_IN_TIME)
            mycom.Parameters("@S_COMM").Value = Format(MSG)
            mycom.Parameters("@S_ETIME").Value = "未復歸"
            mycom.Parameters("@S_USER").Value = Form1.Label3.Text '程式中斷處
           mycom.ExecuteNonQuery()
           SqlConn.Close()
        End Function 
    有上網爬文,一般是指記憶體不足造成的例外.進入MSDN中查詢解決方式只找到異常發生狀況,切看不到改善方法
    小弟電腦作業系統為XP 記憶體4G (系統顯示3.45G) 請問有大大遇到相同的情況嗎?


    新手上路
    2009年7月9日 上午 09:18

解答

  • 沒看到你有把物件釋放...
    要不然就是在跑完 ALM_SET 後下一次 GC.Collect(),但老實說如果是一直都跑這個,那為什麼還要每次做 new/release...

    小人物一枚。
    • 已標示為解答 eblue 2009年7月10日 上午 11:38
    2009年7月9日 上午 09:28
    版主

所有回覆

  • 沒看到你有把物件釋放...
    要不然就是在跑完 ALM_SET 後下一次 GC.Collect(),但老實說如果是一直都跑這個,那為什麼還要每次做 new/release...

    小人物一枚。
    • 已標示為解答 eblue 2009年7月10日 上午 11:38
    2009年7月9日 上午 09:28
    版主
  • 請問大大您指的物件釋放
    SqlConn.Close() 這個指令不是嗎??

    新手上路
    • 已編輯 eblue 2009年7月10日 上午 11:13
    2009年7月10日 上午 10:51
  • SqlConn.Close() 只是關閉連線而已。
    小人物一枚。
    2009年7月10日 上午 10:52
    版主
  • 我發現了~~
    所以加了這個.SqlConn.Dispose()
    感謝大大的提點 
    新手上路
    2009年7月10日 上午 11:13
  • 記憶體耗用的原因小弟大致上找到了是我收集RS232的回應!一直沒去執行這段RemoveHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived
    除了感謝小朱大大!還得謝謝bill大大在前一個問題對我的幫助!!
    新手上路
    2009年7月10日 上午 11:41
  • 因為你不Remove就 Add ,會加個沒完啊.

    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    2009年7月10日 上午 11:56
    版主