Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер памяти JVM, как сделать адекватным задаче? 
V
    Опции темы
Vitaly333
Дата 29.5.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



У меня тоже возникли не которые проблемы с очисткой памяти. 
Есть алгоритм который использует структуру данных - массив указателей на строки (зубчатый двумерный массив A).
Алгоритм работает с большими объемами данных. Во время работы алгоритма некторые элементы массива становятся не нужными и
поэтому я их периодически очищаю (5 раз в ходе самого алгоритма запускаю процедуру очистки). 
Как я это делаю: Прохожу по уже обработаным строкам зубчатого массива (Цикл J = 0,...,i-1) и собираю только нужные элементы во временный массив (TempRow).
Для каждой строки свой временный массив TempRow, размер которого (size) естественно меньше размера соответствующей строки зубчатого массива (A.data[j].length).
Далее перекидываю ссылку в зубчатом массиве со старой строки на этот новый временный массив вызовом функции  A.SetData(j,TempRow.getArray()).
Т.е память, которая отводилась под старую строку должна быть по идеи освобождена. Далее удаляю ссылки на TempRow чтобы при следующем вызове процедуры очистки старые строки удалялись.
После всего этого принудительно вызываю сборщик мусора. Но при последующих вызовах процедуры очистки память не освобождается а только растет и растет. Ссылок на   
new ModDoubleArrayList(size) кроме TempRow и ссылки в массиве указателей на строки больше  нигде в алгоритме нету.

Вот кусок кода, взятого из алгоритма, который выполняет очистку:

Код

// Процедура очистки

// Выполняется 5 раз в процессе работы алгоритма

          for (j=0;j<i;j++){
             
             
             L = IU[j];
             R = IU[j+1];
             
             size = R-L;
         
         ModDoubleArrayList TempRow = new ModDoubleArrayList(size);
             
         // Сборка данных в TempRow
    
                    for (k=L;k<R;k++){
                 
                 index = k-L;
                 col = JU.get(j,index);
                 jj = Math.abs(col);                    
                 a = A.get(j,index);
                 
                 if (jj<st ||jj>=i ){                     
                     
                     TempRow.add(a); 
                     
                 }
                 else {
                     if (col>0) {
                         
                         TempRow.add(a);
                         
                     }
                     else r2++;
                                                                         
                 }                                                
             }
             
            // Выравнивание размера

              TempRow.trimToSize();

                   // Вставка в данных  в строку

              
              A.SetData(j,TempRow.getArray());
              
                   
                  // Удаление ссылок            
              
             
              TempRow.clear2();             
              TempRow = null;                                            
                                       
         }
                           
          }
             
             System.gc();
             System.gc();
             System.gc();
             System.gc();            
             
        }



Код массива указателей на строки, здесь я привел только необходимые функции:

Код


public class TDynamicDoubleArray {

        private double[][] A;
        int pos;


public TDynamicDoubleArray(int n){        
            A = new double[n][];
            pos = 0;
        }

void SetData(int i,double[] data) {                            
        A[i] = data;        
        }
}


Вот код для TempRow:

Код

public class ModDoubleArrayList {
    
    
     public double[] data;

       
        private int pos;


 public ModDoubleArrayList(int capacity) {
            data = new double[capacity];
            pos = 0;
        }


public void add(double val) {
        
        data[pos++] = val;
        }

public void clear2() {
            data = null;
            pos = 0;
        }
        

        public void trimToSize() {
            
            double[] tmp = new double[pos];
            System.arraycopy(data, 0, tmp, 0,pos);
            data = tmp;
        }


public double[] getArray(){
        return data;
        }
}


PM MAIL   Вверх
COVD
Дата 29.5.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Моя практика показывает, что для идеального поведения GC ему следует помогать, обнуляя ссылки вручную и не допуская возникновения перекрёстных ссылок в дохлых объектах.


В многопоточном приложении, на мой взгляд, есть нюанс. Если обьект стал ненужным, но есть вероятность, что другой поток все еще копается в этом обьекте, то чистить его (обнулять внутренние ссылки) никак нельзя. Только ссылку на сам обьект обнулить можно. Или синхронизацию вводить. Я по этой причине перестал помогать gc. Просто выбрасываю.

Это сообщение отредактировал(а) COVD - 29.5.2008, 15:27
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.