Попытка заполнить список из размера набора результатов составляет около 12000 строк при повторном выполнении действия примерно 4 раза, jvm выходит из кучи памяти

Я пытаюсь заполнить список массивов типа tableList базой данных примерно с 12000 записями, а затем заполнить мою страницу jsp с помощью тега итератора struts, но при выполнении этого действия снова и снова jvm выходит из памяти, и, как я вижу, размер кучи продолжает уменьшаться каждый раз, когда я вызываю это действие со своей страницы. Я считаю, что пространство списка не освобождается всякий раз, когда создается новый экземпляр этого класса действий. Предложите решение этой проблемы. Я также запускаю tableList.clear ( ); в конструкторе класса

int records=0;
        spl("BEFORE: "+run.freeMemory()+"-"+run.totalMemory()+"-"+run.maxMemory());//spl is for system.out.println and run is an object of Runtime class
        while(resultSet.next())
        {
            records++;
            if(!resultSet.getString("service_date").equals("N/A"))
            {
                serviceYear=resultSet.getString("service_date").split("-");
                regnNumber=officeCode+"/"+resultSet.getString("serviceid_requested")+"/"+resultSet.getString("country_code")+"/"+resultSet.getString("service_file_srno")+"/"+serviceYear[2];
            }
            else
            {
                regnNumber=officeCode+"/"+resultSet.getString("serviceid_requested")+"/"+resultSet.getString("country_code")+"/"+resultSet.getString("service_file_srno")+"/0000";
            }
            tableList.add(new MISTable(regnNumber,resultSet.getString("given_name"),resultSet.getString("surname"),
                                        resultSet.getString("nationality"),resultSet.getString("service_date"),resultSet.getString("service_expiry_date"),
                                        resultSet.getString("passport_number"),resultSet.getString("passport_expiry_date"),resultSet.getString("visa_number"),
                                        resultSet.getString("visa_expiry_date"),resultSet.getString("visa_type"),"")
                                        );
        }
        spl("AFTER: "+run.freeMemory()+"-"+run.totalMemory()+"-"+run.maxMemory());

person Shivam Khandelwal    schedule 06.12.2012    source источник
comment
лучше использовать пагинацию, что-то вроде этого.   -  person sunleo    schedule 06.12.2012


Ответы (2)


Вы можете увеличить аргументы памяти Java для запуска приложения.

-Xms256m -Xmx512m -XX:MaxPermSize=128m

Вы можете установить максимальную память для java...

person Vishal    schedule 06.12.2012

Используйте нумерацию страниц!

Вы можете загрузить весь список и показать только одну страницу (скажем, 10 записей) на странице (лучше с кешем), ИЛИ (намного лучше) загрузить только ту часть набора результатов, которую вам нужно показать, ограничив результаты с помощью SQL.

Загружать 12000 записей и помещать их на страницу неправильно, это перегружает сервер, клиент и, кстати, тех, кто хочет читать (или прокручивать) веб-страницу высокую, как строительство ?

person Andrea Ligios    schedule 06.12.2012
comment
Я знаю, это то, что я делаю прямо сейчас, я просто хочу знать, почему память jvm не возвращается в кучу после создания экземпляра нового класса, и есть ли способ очистить ее в моем классе действий, потому что метод .clear кажется нет используйте, как я думаю, список из предыдущего экземпляра остается в куче ... и освобождается только ссылка на список, а не ссылки, которые он содержит, на объекты MISTable в нем. - person Shivam Khandelwal; 07.12.2012
comment
Установите для всех вещей значение null (и, очевидно, закройте те, которые должны быть закрыты). Таким образом, вы говорите сборщику мусора собрать их как можно скорее. - person Andrea Ligios; 07.12.2012