程式的記憶體使用量越來越大? |
尚未結案
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
我有一個程式,執行後,發現它的記憶體的使用量越來越大.記憶體一下子就快被吃光了.我的程式裡,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 發送簡訊給我 |
可以說明一下您想做什麼嗎 ? 或許有別的建議方案
那幾台電腦有何差異性嗎? 為何不將 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 發送簡訊給我 |
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
引言: 可以說明一下您想做什麼嗎 ? 或許有別的建議方案 那幾台電腦有何差異性嗎? 那台電腦是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 發送簡訊給我 |
|
Albertz
初階會員 發表:2 回覆:57 積分:31 註冊:2002-09-05 發送簡訊給我 |
我修改了一些邏輯上可能會發生問題的地方. 另外, 這個 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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
我覺得問題可能在這裡:
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 發送簡訊給我 |
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
引言: 我覺得問題可能在這裡: 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 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
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 發送簡訊給我 |
|
allanchou
一般會員 發表:9 回覆:35 積分:8 註冊:2003-04-01 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
我的系統需要 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |