2016-11-28 148 views
1

在應用程序中,我有一個任務,直到它崩潰,一直消耗內存。用processExplorer觀察我發現下面的函數每次調用時都會分配大約50MB(它被稱爲30次)。當函數退出時,這個內存不會被釋放,即使我調用了GarbageCollect。需要注意的是所謂的像功能:powerbuilder內存不釋放

Of_IsOrario, Of_GetCell, Of_GetRowCount, Of_GetColCOunt 

剛剛返回值(不分配內存)

long ll_file, i, j, ll_bytes, ll_fileWithTitles 
double ld_value 
string ls_line 
n_cst_string str 



ll_fileWithTitles = FileOpen(as_fileName + "text.txt", LineMode!, Write!, Shared!, Replace!, EncodingAnsi!) 
ll_file = FileOpen(as_fileName, LineMode!, Write!, Shared!, Replace!, EncodingAnsi!) 

if ll_file < 0 then 
     MessageBox("Σφάλμα", "Could not create file " + as_fileName) 
     return false 
end if 

for i = 1 to Of_GetColCount() 
     if in_tasks[i].Of_IsOrario() then 
       ls_line += "~tO" + in_Tasks[i].is_symbol 
     else 
       ls_line += "~t" + in_Tasks[i].is_symbol 
     end if     
next 
FileWrite(ll_fileWithTitles, ls_line) 

for i = 1 to Of_GetRowCount() 
     ls_line = "" 
     for j = 1 to Of_GetColCount() 
       ld_value = -Of_GetCell(i, j) 

       if ls_line <> "" then ls_line += "~t" 
       ls_line += string(ld_value) 
     next 
     ls_line = str.Of_GlobalReplace(ls_line, ",", ".") 
     if IsNull(ls_line) then 
       ls_line = ls_line 
     end if 
     ll_bytes = FileWrite(ll_file, ls_line) 
     ls_line = string(in_matrix[i].il_agentId) + "~t" + ls_line 
     ll_bytes = FileWrite(ll_fileWithTitles, ls_line) 
next 

FileClose(ll_file) 
FileClose(ll_fileWithTitles) 

return true 
+0

PowerBuilder的版本? –

+0

爲什麼你有構造'如果IsNull(ls_line)然後ls_line = ls_line ...'。它會改變什麼嗎?我可以理解'ls_line =「」' –

回答

0

我不知道你的PowerBuilder的版本是什麼,但是嘗試更換ISNULL()

CR#304251 PB企業語言 - 運行時8.0.3 UpperBound上的任何一個blob 不是一個數組,並且大的blob上的IsNull函數正在泄漏 內存。對任何變量執行這些函數時都會發生泄漏。 這是一個錯誤,但不能在8.0.3補丁中修復。解決方法也是 使用實際的數據類型變量。

CR#279144 PB Enterprise DW - Runtime 8.0.1 IsNull的點號表示爲 datawindow列數據泄漏內存。

CR#217105 PB企業窗口 - 當 一個應用程序在開發或運行時(P碼和機器代碼)上運行,當 ISNULL與任何數據類型使用運行時7.0.2內存使用上升。

[...]

它還增加了以下內容:

Yield() 
GarbageCollect()