2010-10-05 2 views
1

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() при закрытии приложения каждый раз.

Но похоже, что приложение по-прежнему выделяет слишком много памяти и не выпускает все из них.

Спасибо за любое предложение.

С уважением,

Caxton

+0

Точка @ Stephen, 'System.gc()' - это всего лишь предложение для запуска gc, а не мандат. –

+1

У меня есть ощущение, что здесь происходит что-то еще, мы не видим ... –

+0

выглядит как кто-то еще держит m_byStreamBuf – bhups

ответ

0

меня пытаются назвать System.gc(), когда близко приложение каждый раз.

Это определенно не поможет. Java автоматически запускает сборщик мусора, если на нем не хватает места. Вы получаете OOME только в том случае, если GC не смог освободить достаточную память. (На самом деле это чрезмерное упрощение ... но это выходит за рамки вашего вопроса.)

Если у вас заканчивается память, это будет потому, что что-то мешает вашим экземплярам приложений уходить после их завершения , Возможно, есть что-то, что приложение должно делать, когда оно закончено, что ваш не делает.

Одним из хакерских исправлений было бы назначить null на m_byStreamBuf, когда ваше приложение закончится. Но это все еще оставляет меньше утечек памяти.

0

Создать слабые ссылки

+0

Я не думаю, что soft/weak refs будут работать в этом случае, так как это как-то держит сильную ссылку в другом месте. Кроме того, это не дополнительный кеш, который может быть восстановлен, так как он поступает из реального потока. –

0

в одиночку Этот класс не должен быть причиной ошибки из памяти, как это едва ли с помощью кучи (15 * 256 * 1024 + 512 * 1024 = 4456448 = ~ 5МБ ??). Тем не менее, несколько экземпляров будут. Где-то в вашем приложении, возможно, вы создаете множество экземпляров этого класса и не освобождаете их должным образом.

Поскольку вы также упомянули, что это происходит после нескольких перезапусков приложения, возможна также утечка памяти. Вы также можете ознакомиться с утечками укладчика здесь http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

Эти вещи нелегко расследовать, но есть обычные подозреваемые. Удачи! :)

Смежные вопросы