線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2388
推到 Plurk!
推到 Facebook!

程式的記憶體使用量越來越大?

尚未結案
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-17 18:06:52 IP:163.28.xxx.xxx 未訂閱
我有一個程式,執行後,發現它的記憶體的使用量越來越大.記憶體一下子就快被吃光了.我的程式裡,new出來的一定會delete.我設定過虛擬記憶體的大小,及看過版上相關文章,但是還是沒有辦法解決這個問題... 我在其它電腦裡試過,並不會有這個問題,為何特別在那某幾台電腦試就會這樣呢?請問是否有哪裡沒有做好.. 我的程式可能是這樣:
TStringList *a;
FormCreate()
{
 a=new TStringList;  
 a->LoadFrom("xxx.txt");
}
Timer1()
{
  AnsiString b;
  b=a->Strings[i];
  i  ;
  //........
}
FormClose()
{
 delete a;
}
請問上述是否會造成這樣的問題呢?是一定要把new和delete同時寫到Timer裡面做就好了呢? 請給我點建議,謝謝.. 發表人 - nlj859 於 2004/09/17 18:38:36
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-21 10:17:09 IP:61.220.xxx.xxx 未訂閱
可以說明一下您想做什麼嗎 ? 或許有別的建議方案 那幾台電腦有何差異性嗎? 為何不將 code 全放 FormCreate ? Timer 預設 1 sec 啟動執行一次, 如果 Timer 佔用記憶體 (例如 local 變數, new 記憶體 ...) 在 1 sec 沒有釋放, 則會隨著時間愈吃愈多 如果 N sec 後第一次執行的 Timer 結束, 則形成穩定的記憶體佔用和釋放 所以系統中會固定佔用 N sec Timer 執行所需要記憶體 因為每台 PC 速度不同, N 值不同, 執行此程式需要佔用的 RAM 不同 如果還沒配置到足夠的 RAM , 系統虛擬記憶體耗盡, 程式可能無法順利執行 如果可以配置到足夠的 RAM , 程式可以順利執行 不要在 Timer 不斷 new 記憶體, 或將變數改用全域變數試看看 PS: 以上推測僅供考
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
Albertz
初階會員


發表:2
回覆:57
積分:31
註冊:2002-09-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-21 10:42:12 IP:211.20.xxx.xxx 未訂閱
WM_TIMER 在 MESSAGE QUEUE 只會留一份, 所以不會有 TIMER HANDLER RE-ENTRY 的問題. 可否把完整的 CODE 丟出來?
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-21 12:37:35 IP:219.80.xxx.xxx 未訂閱
引言: 可以說明一下您想做什麼嗎 ? 或許有別的建議方案 那幾台電腦有何差異性嗎? 那台電腦是CPU 2.4G,256M ram(這台會有問題) 另一台是CPU 1G,512M ram和CPU 1.7G,512M ram (這兩台都沒問題) 為何不將 code 全放 FormCreate ? 請問如何將code全放在FormCreate呢?是指哪些的code? Timer 預設 1 sec 啟動執行一次, 如果 Timer 佔用記憶體 (例如 local 變數, new 記憶體 ...) 在 1 sec 沒有釋放, 則會隨著時間愈吃愈多 但是我發現他每秒都有做完它該做的事,所以還有可以是因為沒有釋放掉的緣故嗎? 如果 N sec 後第一次執行的 Timer 結束, 則形成穩定的記憶體佔用和釋放 所以系統中會固定佔用 N sec Timer 執行所需要記憶體 因為每台 PC 速度不同, N 值不同, 執行此程式需要佔用的 RAM 不同 如果還沒配置到足夠的 RAM , 系統虛擬記憶體耗盡, 程式可能無法順利執行 如果可以配置到足夠的 RAM , 程式可以順利執行 請問該如何知道每台電腦的N值? 等級越低的電腦比較容易出現這種情況嗎?如果是,那為何反而是我那台等級較高的電腦會出事? 不要在 Timer 不斷 new 記憶體, 或將變數改用全域變數試看看 PS: 以上推測僅供考
我的code太長,所以沒辦法整個放上.我只能列出個大概.
TStringList *a;
TForm1::FormCreate()
{
 a=new TStringList;  
 a->LoadFrom("xxx.txt");
}
TForm1::Timer1() //預設1秒
{
  AnsiString b;
  b=a->Strings[i];
  i  ;
  a1(); 
  //........
}
TForm1::FormClose()
{
 delete a;
}
TForm1::a1()
{
 int vA;
 b1(vA);      TStringList *aaa=new TStringList;  
 aaa->LoadFromFile("xxx.txt");
 aaa->Add("xxxxxxxxx");
 aaa->SaveToFile("xxx.txt");
 delete aaa; 
}
TForm1::b1()
{
 //send file to other computer
 //這裡可能要花掉0.5s的時間.
}
煩請回答一下我的問題吧,謝謝.
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-21 13:15:30 IP:210.69.xxx.xxx 未訂閱
會員求助程式檔案上傳區 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 這裡可以上傳程式碼, 然後回來說一下程式碼網址
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
Albertz
初階會員


發表:2
回覆:57
積分:31
註冊:2002-09-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-21 13:32:37 IP:211.20.xxx.xxx 未訂閱
我修改了一些邏輯上可能會發生問題的地方. 另外, 這個 code 時間一久, 記憶體一定會越吃越多, 不管在哪一台系統都一樣. TStringList *a 一直加入 data 但是卻沒有告知何時舊資料該丟棄.    
TStringList *a;
TForm1::FormCreate()
{
 a=new TStringList;  
 a->LoadFrom("xxx.txt");
}
TForm1::Timer1() //預設1秒
{
  AnsiString b;
  b=a->Strings[i];                     //?? initial value for i ??
  i  ;
//  a1(); 
  a1(a); 
  //........
}
TForm1::FormClose()
{
 delete a;
}
TForm1::a1(TStringList *NewData)
{
// int vA;
// b1(vA); 
//
// TStringList *aaa=new TStringList;  
// aaa->LoadFromFile("xxx.txt");
// aaa->Add("xxxxxxxxx");
// aaa->SaveToFile("xxx.txt");
// delete aaa;      int vA;                            //?? initial value for vA ??
 b1(vA); 
//using same TStringList object for "xxx.txt",
// or the data may not synchronize
 NewData->Add("xxxxxxxxx");
 NewData->SaveToFile("xxx.txt");
}
TForm1::b1()
{
 //send file to other computer
 //這裡可能要花掉0.5s的時間.
}
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-21 14:13:36 IP:210.69.xxx.xxx 未訂閱
引言: WM_TIMER 在 MESSAGE QUEUE 只會留一份, 所以不會有 TIMER HANDLER RE-ENTRY 的問題. 可否把完整的 CODE 丟出來?
請教一下 ~~ 【Delphi】【問題】請問 Timer 會 Re-Entry 嗎 ? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56640
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-21 16:26:54 IP:218.160.xxx.xxx 未訂閱
我覺得問題可能在這裡: TForm1::b1() { //send file to other computer //這裡可能要花掉0.5s的時間. } 假如1秒內能做完那還好,假如1秒內做不完(網路塞車),程式可能會過勞死. 試著加個檢查看看,頂多少傳幾個檔,假如要每檔都傳,那就要另想辦法. TForm1::b1() { static int busy=0; if (busy) { ShowMessage("AA");//假如有出現這個訊息,表示真的1秒有可能做不完. return; } busy = 1; //send file to other computer //這裡可能要花掉0.5s的時間. busy = 0; }
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-22 12:41:14 IP:219.80.xxx.xxx 未訂閱
引言: 我修改了一些邏輯上可能會發生問題的地方. 另外, 這個 code 時間一久, 記憶體一定會越吃越多, 不管在哪一台系統都一樣. TStringList *a 一直加入 data 但是卻沒有告知何時舊資料該丟棄.
但是我的TStringList *a只是負責一開始讀檔的動作而已,而且最後會delete掉. 還是一定要LoadFromFile完馬上就delete呢?
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-22 12:43:30 IP:219.80.xxx.xxx 未訂閱
引言: 我覺得問題可能在這裡: TForm1::b1() { //send file to other computer //這裡可能要花掉0.5s的時間. } 假如1秒內能做完那還好,假如1秒內做不完(網路塞車),程式可能會過勞死. 試著加個檢查看看,頂多少傳幾個檔,假如要每檔都傳,那就要另想辦法. TForm1::b1() { static int busy=0; if (busy) { ShowMessage("AA");//假如有出現這個訊息,表示真的1秒有可能做不完. return; } busy = 1; //send file to other computer //這裡可能要花掉0.5s的時間. busy = 0; }
我已經確認這裡不會超過1s的時間... 不知是否有哪裡還有問題的? 謝謝.
jazz
初階會員


發表:10
回覆:43
積分:35
註冊:2002-06-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-29 01:19:55 IP:61.62.xxx.xxx 未訂閱
選Project->Options 將CodeGuard功能全部打勾 再去跑程式 如果有發生記憶體洩漏現象 會有警告視窗出現 再去查程式
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-09-29 15:02:02 IP:61.221.xxx.xxx 未訂閱
1 修改暫存取值大小 15 k(udp) 2 有無log 記錄檔可供自行查緝bug 3 把接收的封包都當成 可有可無 比對陣列內無的值再要求取不足的值 類似桌面的圖 以40k jpeg 分割為 300行 照理應300/40=1行 事實因vcl 不是自己寫的所以 是不一樣的 寫網路 C/S B/S voip sip 應用 沒有記錄檔 只能 猜猜猜 摸摸摸 等等等 你所謂的那高級那台會出錯 即可說明 此程式測試階段仍有接收的BUG http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56540 另外 包子 的 範例 資料應有跡可尋
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-09-29 16:13:09 IP:163.28.xxx.xxx 未訂閱
Hello jazz, 我打開CodeGuard之後,的確是會出現警告視窗. 請問所謂的"記憶體洩漏現象"是說沒delete嗎? 該如何去查程式裡面的錯誤呢? 另外,一個好的程式,當開啟CodeGuard的功能之後,是不會出現任何警告視窗嗎? 請指教.
allanchou
一般會員


發表:9
回覆:35
積分:8
註冊:2003-04-01

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-21 08:57:44 IP:61.30.xxx.xxx 未訂閱
試試先TStringList->Clear(), 再delete TStringList, 看看有無改善....
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-10-21 18:32:45 IP:220.139.xxx.xxx 未訂閱
我的系統需要 24 小時 Online 我也觀察過,程式占用的實體記憶體也是愈來愈多,但是在程式中,當然有 new 的都有 delete 了...    之前我也有類似的問題: ■【問題】實體記憶體變少了  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=52293 結論是,工作管理員的資料只能作參考 < > 所以囉,只要程式不當,應該都還好啦 < > 個人猜想,應該在我們使用的 VCL 其內有作一些有的沒的操作,讓記憶體愈來愈大,可以這樣想,一開始,程式載入,所有占用記憶體都是連續的,但在程式執行中,有部分會 delete 有部分會再 new 或 re-locate,此時,就會有一些記憶體的小空洞,這些空洞不能放得下另一個 new 出的物件,就變成用不到,但程式還是繼續操作 new/delete/re-locate... 所以會愈來愈大... (純個人胡亂猜想 安慰一下自己,因為自己也找不出為什麼好好的程式占用記憶體會愈來愈大) < href="http://dllee.ktop.com.tw" target="blank">吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ SoftKing VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com
系統時間:2024-06-02 9:11:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!