Существует несколько причин нехватки памяти.
Во-первых, самый простой случай - вам просто нужно больше кучи. Вы используете максимальную кучу 512M, когда ваша программа может корректно работать с 2G. Увеличение с -Xmx2048m
в качестве опции JVM, и все в порядке. Также имейте в виду, что 64-битные виртуальные машины будут использовать в два раза больше памяти, чем 32-битные виртуальные машины, в зависимости от структуры этих данных.
Если ваша проблема не так проста, вы можете посмотреть на оптимизацию. Замена объектов примитивами и так далее. Это может быть вариантом. Я не могу сказать, основываясь на том, что ты написал.
Однако в конечном итоге вы попадаете на перекресток, где вам приходится выбирать между виртуализация и разбиение .
Виртуализация в этом контексте просто означает некоторую форму притворства, что памяти больше, чем есть. Операционные системы используют это с виртуальными адресными пространствами и используют пространство жесткого диска в качестве дополнительной памяти. Это может означать только одновременное хранение части структуры данных в памяти и сохранение оставшейся части во вторичном хранилище (например, в файле или базе данных).
Разделение разделяет ваши данные на несколько серверов (реальных или виртуальных). Например, если вы отслеживаете биржевые торги на NASDAQ, вы можете поместить биржевые коды, начинающиеся с «A» на server1, «B» на server2 и т. Д. Вам нужно найти разумный подход, чтобы разделить ваши данные так, чтобы уменьшить или устраните необходимость в кросс-коммуникациях, потому что именно кросс-коммуникация ограничивает вашу масштабируемость.
В таком простом случае, если вы сохраняете 30K слов и 30K x 30K словосочетаний, вы можете разделить его на четыре сервера:
- А-М х А-М
- A-M x N-Z
- N-Z x A-M
- N-Z x N-Z
Это всего лишь одна идея. Опять же, это трудно сделать, не зная специфики.