2010-10-05 68 views
1

嗨,多次執行應用程序後內存不足

有一個奇怪的內存不足錯誤問題。

我創建一個類來解析實時流,並且該類需要緩衝區來保存這些原始數據。

以下是代碼片段:

/* Initial and uninitial buffer in class */ 
private final int MAX_BUFFER = 16; 
protected byte[][] m_byStreamBuf = null; // Frame buffer 
public void InitBuffer() { 
    m_byStreamBuf = new byte[MAX_BUFFER][]; 
    m_byStreamBuf[0] = new byte[512*1024]; // for I Frame 
    for (int i = 1; i < MAX_BUFFER; i++) { 
    m_byStreamBuf[i] = new byte[256*1024]; // for P frame 
    } 
} 

public void UninitBuffer { 
    this.m_byStreamBuf = null; 
    System.gc(); 
} 

內存不足錯誤開始後會發生並關閉應用程序幾次(實際上也許三到四次)。

我檢查錯誤發生在分配內存的行上。

我每次都嘗試在關閉應用程序時調用System.gc()。

但似乎應用程序仍然分配太多的內存,不釋放所有的內存。

感謝您的任何建議。

問候,

卡克斯頓

+0

對@斯蒂芬的觀點,'System.gc()'只是gc運行的一個建議,而不是一個授權。 – 2010-10-05 05:41:20

+1

我有一種感覺,在這裏我們沒有看到其他東西... – 2010-10-05 05:42:03

+0

看起來像別人正在保持m_byStreamBuf – bhups 2010-10-05 06:42:38

回答

0

我有嘗試調用System.gc()時關閉應用程序每次。

這絕對沒有幫助。如果運行不足,Java將自動運行垃圾回收器。如果GC未能釋放足夠的內存,則只能獲得OOME。 (實際上,這是一個過於簡化......但這超出了你的問題的範圍。)

如果你內存不足,這將是因爲有些東西阻止你的應用程序實例在完成後消失。也許當應用程序完成時,應用程序應該執行某些操作,而您的操作並未完成。

當您的應用程序完成時,一個難題就是將null指定爲m_byStreamBuf。但是,這仍然留下較少的內存泄漏。

0

創建弱引用

+0

我不認爲soft/weak refs在這種情況下會起作用,因爲它在別的地方有某種強有力的參考。另外,它不是一個可選的緩存,它可以從直播流中恢復。 – 2010-10-05 12:46:10

0

,因爲它幾乎不使用堆單獨此類不應該造成內存不足錯誤(15 * 256 * 1024 + 512 * 1024 = 4456448 =〜5MB ??)。但是,多個實例會。在你的應用程序的某個地方,也許你正在創建很多這個類的實例,而不是正確地釋放它們。

既然你也提到過,這發生在多次重新啓動應用程序之後,那麼內存泄漏也是可能的。你也可以看看這裏的classloader泄漏http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

這些事情不容易調查,但有通常的嫌疑人。祝你好運! :)

相關問題