Java JVM сохраняет выделение памяти для операционной системы - PullRequest
0 голосов
/ 25 апреля 2011

Я использую 1.6.0_25 64 бит на Windows 7 64 бит.

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

Я запускаю тест Java -Xms2G -Xmx3G

Следующий код - моя попытка ввести весь файл ... так, чтобы я не столкнулся с ошибками страницы при чтении.

File f = new File("veryLARGEfile.txt");
FileInputStream in = new FileInputStream(f);
int i = (int) f.length();
System.out.println("Bytes in file: " + i);

byte[] file = new byte[i];
i = in.read(file);
System.out.println("Bytes read: " + i);

выполняя этот метод, я вижу, что в диспетчере задач Windows система достигает 2 ГБ памяти, пока она читает файл ... но как только она закончит чтение ... память снова падает вниз !!!!

Это серьезная проблема ... мне нужно, чтобы весь байтовый массив оставался в активной памяти.

Спасибо, эй


Я изменил код, чтобы использовать базовые типы массивов int [] [] и float [] [] для хранения моих данных вместо хранения ArrayLists объекта, содержащего int и float.

делая это, я обнаружил, что моя java-память не переставляется (поэтому, я полагаю, кучная память обрабатывается здесь немного иначе, чем в стеке) [о, я также изменил весь код, чтобы он был статически типизирован - я знаю, очень плохой стиль программирования]

проблема, с которой я сейчас сталкиваюсь, заключается в том, как обрабатывать мой HashMap ... все мои попытки создания таблицы поиска терпят неудачу из-за времени выполнения O (n ^ 2) !!!

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

Решение о том, какие части памяти процесса хранить в оперативной памяти, а какие обменивать, принимает ОС, а не JVM.Как правило, ОС будет хранить память, к которой часто обращаются, в ОЗУ - и если это не так, зачем вам это нужно?

Могут быть API-интерфейсы ОС, которые позволяют вам «закрепить» определенную частьпамяти в ОЗУ, но эта функциональность не предоставляется Java.

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

0 голосов
/ 25 апреля 2011

Java старается изо всех сил сохранить все свои приложения в памяти, или, другими словами, она заменяет их в крайнем случае, поскольку она очень плохо работает, если какая-либо из ее памяти перенесена на диск.

Если вашПриложение Java загружается на диск, потому что ваше приложение использует слишком много памяти для вашей системы.Если ваше приложение требует большого объема памяти и вам нужно использовать этот большой объем памяти, я рекомендую убедиться, что в вашей системе достаточно памяти.КСТАТИ.Вы можете купить сервер с 8 ГБ за ~ 500 долларов и новую рабочую станцию ​​16 ГБ за 1000 долларов.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...