Недостаточно памяти после выполнения приложения несколько раз - PullRequest
1 голос
/ 05 октября 2010

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

Ответы [ 3 ]

0 голосов
/ 05 октября 2010

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

0 голосов
/ 05 октября 2010

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

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

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

0 голосов
/ 05 октября 2010

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

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

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

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

...