HI,
有一个奇怪的内存不足错误问题。
我创建了一个解析实时流的类,该类需要缓冲区来保存这些原始数据。
以下是代码段:
/* 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 :(得分:0)
每次关闭应用程序时,我都会尝试调用System.gc()。
这肯定无济于事。如果垃圾收集器空间不足,它将自动运行垃圾收集器。如果GC未能释放足够的内存,您只能获得OOME。 (实际上,这是一种过度简化......但这超出了你的问题的范围。)
如果你的内存不足,那将是因为有些东西阻止你的应用程序实例在完成后就会消失。也许有一个应用程序在完成时应该做的事情,你的工作没有。
一个hacky修复方法是在您的应用程序完成时将null
分配给m_byStreamBuf
。但这仍然留下较少的内存泄漏。
答案 1 :(得分:0)
创建弱引用
答案 2 :(得分:0)
这个类本身不应该导致内存不足错误,因为它几乎不使用堆(15 * 256 * 1024 + 512 * 1024 = 4456448 = ~5MB ??)。但是,多个实例会。在你的应用程序的某个地方,也许你正在创建这个类的很多实例而不是正确地发布它们。
由于您还提到在多次重新启动应用程序后会发生这种情况,因此也可能发生内存泄漏。您还可以在此处查看类加载器泄漏http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java
这些事情不容易调查,但通常有嫌疑人。祝好运! :)