Как использовать виртуальную память (своп в файловой системе Linux) в веб-программировании Java - PullRequest
0 голосов
/ 02 октября 2009

Я работаю в Java-приложении. В каком-то разделе я использую очень большую переменную дерева, которая сохраняет и сохраняет в памяти (RAM). Могу ли я перенести это в виртуальную память (своп). примечание: огромное дерево состоит из имени и адреса электронной почты для всех пользователей, которые используют в текстовом поле Ajax предложение.

Ответы [ 6 ]

3 голосов
/ 02 октября 2009

В Linux нет стандартного способа принудительно поменять блок памяти, поэтому у JVM не будет способа попросить ОС выполнить такую ​​задачу.

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

Но вы, вероятно, не хотите этого, потому что запись на диск чрезвычайно медленнее по сравнению с вводом / выводом физической памяти.

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

1 голос
/ 18 февраля 2010

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

Вы предполагаете, что система будет более эффективной при слепой обработке файла подкачки, чем если бы на файл подкачки влиял код, который знает, что будет в будущем. гораздо эффективнее выгрузить память, которая, как вы знаете, не будет использоваться какое-то время, чем система, которая просматривает все элементы в памяти и пытается эффективно поместить некоторые из них в этот файл.

Конечно, несмотря на свою ошибку, вы все в некоторой степени правы. ЛОКАЛЬНАЯ база данных была бы наиболее эффективным способом хранения данных в ФАЙЛ (где они будут записываться и считываться). Если у вас нет доступа к локальной базе данных, введите один код. Хэш-карта предназначена для хранения в памяти, а упорядоченный индексированный связанный список предназначен для хранения на диске. Попытка проталкивания непосредственно из памяти на диск без учета эффективности обоих носителей неэффективна.

1 голос
/ 02 октября 2009

Работающий Java-образ, который частично выгружается для замены, является мертвым Java-изображением. Как только в игру вступит достаточно энергичный GC, вы вернетесь ко всей странице. Страница достаточно плохая. Если на самом деле у вас недостаточно оперативной памяти, вы в конечном итоге получаете нереализованную работу сервера. Пейджинговая Java - это плохо (тм).

Если у вас достаточно оперативной памяти, вам вообще не нужен своп.

Заполните ваш список таблицей базы данных на диске, проиндексируйте его, ограничьте наборы результатов и сделайте соответствующие запросы к нему. Это будет чистый выигрыш, и БД сможет кэшировать понравившиеся страницы, так что вам не нужно об этом думать.

Или получить больше оперативной памяти.

1 голос
/ 02 октября 2009

Ваша ОС автоматически управляет собственной памятью и выталкивает файлы в файл подкачки по мере необходимости.

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

Редактировать: вам не обязательно настраивать выделенный компьютер базы данных. Учитывая, что вы сейчас пытаетесь сохранить все свои данные в памяти, вы, вероятно, можете использовать встраиваемую базу данных, такую ​​как HSQLDB или SQLite , которые имеют ограничения по размеру 16 ГБ и 2 ТБ. соответственно.

1 голос
/ 02 октября 2009

Пусть ОС позаботится об этом.

0 голосов
/ 18 августа 2010

Как об этом, как о другом взгляде на ту же проблему: я создаю много PDF-файлов на стороне сервера, у меня есть 10 из 1000 клиентов, которые обычно хотят запускать отчеты в одно и то же время месяца. Средний размер PDF может быть 7-10 МБ. Имея доступ к конечной куче, «обмен» данными во временный файл является правильным способом создания PDF-файлов, поскольку мне нужно иметь возможность установить длину содержимого в ответе до потоковой передачи данных PDF на клиент.

Возможно, вместо того, чтобы просто задавать вопросы дизайну, могут пригодиться некоторые полезные опции. Лично я смотрю на использование одного временного файла на процесс или одновременный доступ к одному файлу подкачки.

Что бы вы предложили?

...