Rafał Ś.

Rafał Ś. Programista JavaEE

Temat: ADF - OutOfMemoryError podczas iteracji

Witam,

mam tutaj ideowy kawałek kodu:

DCIteratorBinding iterator = ... ; //pobranie iteratora
RowSetIterator rsi = iterator.getRowSetIterator();
Row[] rows = rsi.getAllRowsInRange();

while (rows.length>0) {
rows = rsi.getNextRangeSet();
}

Podczas iteracji wyrzuca mi OutOfMemoryError. Przypuszczam, że gdzieś są trzymane wszystkie te rekordy, dlatego po pewnym czasie brakuje pamięci. W jaki sposób można iterować bo bardzo dużej ilości danych usuwając niepotrzebne już dane ?

Proszę o pomoc
Rafał

konto usunięte

Temat: ADF - OutOfMemoryError podczas iteracji

...

Java wykorzystuje mechanizm Garbage Collectora, który, zamiast programisty, zajmuje się zwalnianiem pamięci. W praktyce, jeśli występuje błąd OutOfMemoryError, to naprawdę systemowi brakuje pamięci. AKA: do każdego z istniejących obiektów istnieje aktywna referencja.

twoje możliwości: upewnij się, że zwalniasz wszystkie zmienne. Jeśli gdzieś wcześniej zadeklarowałeś jakąś duża tablicę, przypisz jej wartość null. To może być znak dla GC by dany obiekt usunąć. Druga możliwość - przydziel maszynie wirtualnej więcej pamięci. Spróbuj uruchomić program z -Xmx512m, potem eq. -Xmx1024m, etc.

konto usunięte

Temat: ADF - OutOfMemoryError podczas iteracji

Lub spróbuj w pętli zrobić inaczej.
Iterator może być pusty a mimo to jak z taką tablicą stworzy np tablicę o rozmiarze 1000 elementów a zajętych jest ok 200 (przykład)
spróbuj w pętli coś takiego:

while ((rows.hasNext)>0)
{
rows = rsi.getNextRangeSet();
}
Te które będą "puste" to automatycznie Garbage Collector postara się je przyciąć i wywalić z pamięci.

konto usunięte

Temat: ADF - OutOfMemoryError podczas iteracji

Krzysztof Telka:
Lub spróbuj w pętli zrobić inaczej.
Iterator może być pusty a mimo to jak z taką tablicą stworzy np tablicę o rozmiarze 1000 elementów a zajętych jest ok 200 (przykład)

To bez sensu. Tablica ma wówczas rozmiar 32bity*1000 = 4kb. Tablica przechowuje tylko referencje do obiektów, a nie obiekty. To nie C. Strata pamięci jest praktycznie zerowa.
Rafał Ś.

Rafał Ś. Programista JavaEE

Temat: ADF - OutOfMemoryError podczas iteracji

Dziękuję za wskazówki, wydaje mi się że problem jest ściśle związany z ADF. Iterując po RowSetIterator, gdzieś w środku zaczyna mi to puchnąć. Tablica rows zostaje zwalniana, ponieważ przypisują do niej co chwilę nową referencję. GC zostanie wywołany przed OutOfMemoryError. Problem tkwi w RowSetIterator. Muszę jakoś usunąć te wiersze po których iterowałem. Próbowałem różnymi sposobami to przeczyścić, ale na razie bez skutku. Próbowałem z DCIteratorBinding, RowSetIterator oraz ViewObject. Zwolnienie zmiennych DCIteratorBinding, RowSetIterator, ViewObject spowoduje zwolnienie dużej ilości pamięci, lecz ja te zmienne potrzebuje do iterowania :)Rafał Świerczek edytował(a) ten post dnia 24.11.10 o godzinie 22:29
Rafał Ś.

Rafał Ś. Programista JavaEE

Temat: ADF - OutOfMemoryError podczas iteracji

Problem rozwiązany,

DCIteratorBinding iterator = ... ; //pobranie iteratora
iterator.getViewObject().setForwardOnly(true); //rozwiązanie
RowSetIterator rsi = iterator.getRowSetIterator();
Row[] rows = rsi.getAllRowsInRange();

while (rows.length>0) {
rows = rsi.getNextRangeSet();
}

Następna dyskusja:

problem podczas instalacji ...




Wyślij zaproszenie do