Как использовать виртуальную память (своп в файловой системе Linux) в веб-программировании Java
Я работаю в веб-приложении Java. В каком-то разделе я использую очень большую переменную дерева, которая сохраняет и сохраняет в памяти (RAM) . Могу ли я перенести это в виртуальную память (своп). примечание: огромное дерево состоит из имени и адреса электронной почты для всех пользователей, которые используют в текстовом поле Ajax предложение.
6 ответов
В Linux не существует стандартного способа принудительно поменять блок памяти, поэтому у JVM не будет способа попросить ОС выполнить такую задачу.
Лучшее, что вы можете сделать, если вам нужна эта функциональность, это сериализовать дерево и записать необработанные данные в файл на диске, а затем вернуть их обратно, когда вы будете к этому готовы.
Но вы, вероятно, не хотите этого, потому что запись на диск очень медленная по сравнению с вводом / выводом физической памяти.
Например, позвольте ОС беспокоиться об этом. Можно с уверенностью предположить, что он знает лучший способ управления памятью, чем вы.
Мне интересно, что все говорят ему, что хранение элементов на диске ужасно неэффективно, и в то же время он рекомендует использовать базу данных, вероятно, удаленную, которая будет хранить данные на диске... на другой машине...
Вы предполагаете, что система будет более эффективной при слепой обработке файла подкачки, чем если бы на файл подкачки влиял код, который знает, что ждет в будущем. гораздо эффективнее поменять память, которая, как вы знаете, не будет использоваться какое-то время, чем для системы, которая просматривает все элементы в памяти и пытается эффективно поместить некоторые из них в этот файл.
Конечно, хотя вы и ошибаетесь, вы все в некоторой степени правы. ЛОКАЛЬНАЯ база данных будет наиболее эффективным способом хранения данных в ФАЙЛ (где они будут записываться и считываться). Если у вас нет доступа к локальной базе данных, введите один код. Хэш-карта предназначена для хранения в памяти, а упорядоченный индексированный связанный список предназначен для хранения на диске. Попытка проталкивания непосредственно из памяти на диск без некоторого учета эффективности обоих носителей неэффективна.
Ваша ОС автоматически управляет собственной памятью и при необходимости выталкивает файлы в файл подкачки.
Если у вас много данных, вы можете подумать о том, чтобы хранить свои данные в базе данных вместо огромного дерева в памяти. Это, вероятно, позволит лучше масштабировать ваше приложение, а также может повысить производительность - это, безусловно, даст вам лучшую производительность, чем чтение и запись всей структуры на диск всякий раз, когда вам нужно просмотреть или изменить запись.
Изменить: вам не обязательно настраивать выделенный компьютер базы данных. Учитывая, что вы сейчас пытаетесь сохранить все свои данные в памяти, вы, вероятно, можете использовать встраиваемую базу данных, такую как HSQLDB или SQLite, которые имеют ограничения по размеру 16 ГБ и 2 ТБ соответственно.
Работающий Java-образ, который частично выгружается для замены, является мертвым Java-изображением. Как только в игру вступит достаточно энергичный GC, вы вернетесь ко всей странице. Страница достаточно плохая. Если на самом деле вам не хватает оперативной памяти, вы в конечном итоге получаете нереализованный сервер. Постраничная Java - это плохо (тм).
Если у вас достаточно оперативной памяти, вам вообще не нужен обмен.
Наполните свой список таблицей базы данных на диске, внесите в нее индекс, ограничьте наборы результатов и выполните соответствующие запросы. Это будет чистый выигрыш, и БД сможет кэшировать понравившиеся страницы, так что вам не нужно об этом думать.
Или получить больше оперативной памяти.
Как об этом, как о другом взгляде на ту же проблему: я создаю много PDF-файлов на стороне сервера, у меня есть 10 из 1000 клиентов, которые обычно хотят запускать отчеты в одно и то же время месяца. Средний размер PDF может быть 7-10 МБ. Имея доступную конечную кучу, "обмен" данными во временный файл является правильным способом создания PDF-файлов, поскольку мне нужно иметь возможность установить длину содержимого в ответе до потоковой передачи данных PDF на клиент.
Возможно, вместо того, чтобы просто задавать вопросы дизайну, могут пригодиться некоторые полезные опции. Лично я смотрю на использование либо одного временного файла на процесс, либо одновременного доступа к одному файлу подкачки.
Что ты предлагаешь?