Если вы продолжаете выделять & amp; сохраняя ссылки на объект, вы будете заполнять любой объем памяти, который у вас есть.
Один из вариантов заключается в том, чтобы закрыть прозрачный файл & amp; открываются, когда они переключают вкладки (вы сохраняете только указатель на файл, а когда пользователь переключает вкладку, вы закрываете и очищаете все объекты ... это заставит файл менять медленнее ... но ...), и, возможно, хранить только 3 или 4 файла в памяти.
Другое дело, что вы должны сделать, когда пользователь открывает файл, загружает его и перехватывает любой OutOfMemoryError, тогда (поскольку невозможно открыть файл) закрыть этот файл, очистить его объекты и предупредить пользователя о том, что он должен закрыть неиспользуемые файлы.
Ваша идея динамически расширяющейся виртуальной памяти не решает проблему, поскольку машина ограничена ресурсами, поэтому вы должны быть осторожны и amp; [или g3]
Несколько советов, которые я видел с утечками памяти:
-> Имейте в виду, что если вы поместите что-то в коллекцию, а потом забудьте об этом, вы все еще имеете к ней сильную ссылку, поэтому уничтожаете коллекцию, очищаете ее или делаете что-то с ней ... если нет, вам будет трудно найти утечку памяти.
-> Возможно, использование коллекций со слабыми ссылками (weakhashmap ...) может помочь в проблемах с памятью, но вы должны быть осторожны с ним, поскольку вы можете обнаружить, что объект, который вы искали, был собран.
-> Еще одна идея, которую я нашел, - создать постоянную коллекцию, которая хранится на объектах базы данных, наименее используемых и прозрачно загруженных. Это, вероятно, лучший подход ...
Из моего личного опыта с JasperReports
я могу вывести, что вы будете использовать параметры и поля больше всего. Параметры и поля - это ячейки памяти или значения, которые вы можете заполнить из своего кода, т. Е. При создании отчета.
То, что вы обычно делаете, это заполнение карты параметров или карт с различными настройками для вашего отчета. Я использую параметры, если у меня есть сводная страница или титульная страница (самая первая в отчете). Что-то вроде:
parameters.put("authorName", author); //where authorName is a parameter you have created in your JRXML template.
Затем вы можете использовать некоторые пользовательские "variables"
или вы можете использовать переменные из JasperReports. Некоторые из этих полезных переменных: PAGE_COUNT и PAGE_NUMBER. Они отслеживают ... количество страниц отчета и номера страниц. Конечно, у вас могут быть пользовательские переменные.
Поля используются там, где данные часто меняются. Они очень похожи на параметры, но с каждой итерацией данные могут измениться. Например, поле может быть списком объектов germanCar
для одной итерации и списка объектов japaneseCar
для следующего. Я бы использовал поле для хранения списка объектов Car
, которые могли бы измениться.
Нижняя строка - это параметры, а поля очень похожи, но поля заполняются из JasperReportDataSource
(поэтому они могут часто меняться поскольку вы заполняете этот источник данных), тогда как параметры, которые вы будете использовать для титульных страниц или пользовательских настроек JR, WHILE генерируют сам отчет. Они могут быть довольно запутанными.
Надеюсь, это немного поможет!
Параметры - это простой ввод в JasperReports. Перед использованием вы должны определить параметры в JasperReport. Вы можете отобразить значение переменной, вы можете использовать ее как часть булевых выражений, и вы даже можете передать ее в подзаголовки. Это может быть вход в SQL-запрос.
Поля - это простые определения переменных. Вы можете рассматривать их как переменные экземпляра объекта данных, переданных в отчет, или они могут быть именами ключей, если источником данных является Карта. Если вы настроили JasperReport для создания набора данных на основе SQL, то Fields - это имена столбцов ResultSet. Вы будете использовать поля для отображения набора результатов выполненного SQL-запроса.
Переменные - это еще один вид переменных, которые живут в отчете Jasper, они не являются входами. Они используются для вычисления суммы или среднего значения определенного поля (определенного выше). Вы можете выполнять многие другие предопределенные функции вычисления в полях с использованием переменных.