2010-10-05 41 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

这些事情不容易调查,但有通常的嫌疑人。祝你好运! :)