проблема с jvm при запуске - PullRequest
0 голосов
/ 11 мая 2010

Я могу установить максимальную память как 1000 и не более того, если я установлю память больше этой, он выдаст следующую ошибку.

Произошла ошибка при инициализации ВМ Не удалось зарезервировать достаточно места для кучи объектов Не удалось создать виртуальную машину Java.

Мой вопрос: почему jvm ищет максимальный объем памяти при запуске?

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 12 июня 2010

Sun JVM нуждается в непрерывной области памяти для своей кучи. Используя инструмент vmmap из пакета Sysinternals, вы можете точно изучить структуру памяти процесса Java. Для этого напишите простую программу на Java, например:

public class MemoryLayout {
    public static void main(String[] args) throws java.io.IOException {
        System.in.read();
    }
}

Скомпилируйте эту программу и запустите ее с настройками большой кучи

javac MemoryLayout.java
java -Xmx1000m -Xms1000m MemoryLayout

Затем запустите vmmap, выберите процесс Java и найдите желтую область памяти, размер которой превышает 1000000k. Это куча JVM. Посмотрите далее ниже, и вы в конечном итоге найдете фиолетовую строку, указывающую, что есть сопоставленный файл DLL. Этот файл DLL предотвращает увеличение вашей кучи JVM.

Если вы знаете, что делаете, тогда вы можете перебазировать эту DLL, чтобы она была загружена по другому адресу. Microsoft предоставляет инструмент под названием rebase.exe в составе Microsoft Platform SDK (у меня версия 5.2.3790.1830).

2 голосов
/ 11 мая 2010

Существует два параметра командной строки, которые напрямую управляют размером (нормальной) кучи:

  • -Xmx<nnn> устанавливает максимальный размер кучи
  • -Xms<nnn> устанавливает начальный размер кучи

В обоих случаях <nnn> - это число байтов, с k или m в конце для обозначения килобайт и мегабайт соответственно. Первоначальный размер дает размер кучи, выделенной при запуске JVM, а максимальный размер устанавливает ограничение на его увеличение. (Но JVM также выделяет память для буферов, кучи «permgen», стеков и прочего ... в дополнение к обычной куче.)

Не ясно, какие варианты вы на самом деле предоставляете. (Значение 1000 не имеет никакого смысла. Размер -Xmx должен быть больше 2 мегабайт, а размер -Xms должен превышать 1 мегабайт; см. эту страницу . )

Есть преимущества и недостатки в том, что исходный размер кучи меньше максимального размера кучи; например -Xms100m -Xmx1000m. Но бессмысленно делать максимальный размер кучи больше, чем объем виртуальной памяти, который ваша машина может выделить JVM.

1 голос
/ 11 мая 2010

Как уточняется здесь по причинам реализации (в основном это повышает производительность и является их приоритетом), JVM требует непрерывной адресации памяти, поэтому он должен установить, что он есть при запуске, иначе он будет доступно позже.

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

1 голос
/ 11 мая 2010

почему jvm ищет максимальный объем памяти при запуске.

Он хочет убедиться, что в конечном итоге сможет выделить максимальную сумму, которую, как вы сказали, он может иметь.

Почему вам нужно установить более высокий максимум, чем поддерживает ваш аппарат?

Ответ: Это упростит настройку JVM, если вы просто установите его практически неограниченным, особенно если вы развернули его на разных машинах. Это было возможно в более ранних версиях, но для текущей Sun JVM вы должны определить «правильное» значение для каждой машины. Надеюсь, в будущем появятся более умные / автоматические настройки памяти.

0 голосов
/ 12 июня 2010

Если вы используете 64-битную JVM в 64-битной ОС, у вас не будет этой проблемы. Это проблема только в 32-битных ОС.

...