Недавно работаю над программой для Java. Изначально мне всегда нравилось управление памятью в Java, не нужно беспокоиться о выделении памяти, просто выделяйте — мусорщик вернёт память за вас. Сейчас программа разрабатывается с большим объёмом данных, и ради ускорения я собираюсь загрузить всю информацию в память, что обеспечит быструю реакцию. Я всё ещё постоянно считаю память, думаю о своём собственном объёме данных, которого должно хватить в начале (у моего компьютера 4G памяти, хотя Windows распознаёт 3.5G, но по сравнению с текущим объёмом данных это должно быть нормально).
Неожиданно программа первого эксперимента длилась несколько часов и столкнулась с исключением «Потеря памяти». Смотря свои собственные настройки виртуальной машины, я установил -XMS512M -Xmx1024M. Не задумываясь, я сразу изменил его на -Xms512M -Xmx2048M, и в итоге я не смог зарезервировать достаточно места для object heap. Программа не может подняться. Только тогда я понял, что всё ещё существует предел исходной максимальной памяти. Я искал в интернете и нашёл множество статей, посвящённых этой проблеме. Наконец, я нашёл самую полезную статью на DEV2DEV форуме BEA
Здесь модератор YuLimin провёл тест и пришёл к выводу:
Компания JVM версия Максимальная память (мега) клиент Максимальная память (мега) сервер
ВС 1.5.x 1492 1520
SUN 1.5.5 (Linux) 2634 2660
ВС 1.4.2 1564 1564
SUN 1.4.2 (Linux) 1900 1260
IBM 1.4.2 (Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Сейчас использую JDK1.6.0_05, протестировал. Самое главное в состоянии клиента — мой JDK не распознаёт параметр -Server и не может проверить состояние сервера. Оценки примерно такие же.
ВС 1.6.0 1442 N/a
Похоже, что использовать большую память в Java невозможно. Общее выражение такое: если память слишком большая, время сбора мусора будет долгим. Это также понятно: обычно собирается, когда памяти недостаточно, сканирование 2G-памяти, конечно, гораздо медленнее, чем 1G, и объектов памяти больше, оценённая зависимость растёт экспоненциально.
Ниже прилагаются методы тестирования и результаты тестов YuLimin.
Метод тестирования: используйте команду java -XmxXXXXM -version для тестирования в командной строке, а затем постепенно увеличивайте значение XXXX; если всё работает нормально, это означает, что заданный размер памяти доступен, в противном случае будет напечатано сообщение об ошибке. |