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).