Максимальный объем памяти на процесс Java в Windows? - PullRequest
24 голосов
/ 12 июня 2009

Какой максимальный размер кучи можно выделить в 32-битной Windows для процесса Java с помощью -Xmx?

Я спрашиваю, потому что хочу использовать данные ETOPO1 в OpenMap , а размер необработанного двоичного файла с плавающей запятой составляет около 910 МБ.

Ответы [ 5 ]

45 голосов
/ 12 июня 2009

Нет ничего лучше, чем эмпирический эксперимент, чтобы ответить на ваш вопрос. Я написал программу на Java и запустил ее, указав флаг XMX (также использовал XMS = XMX для принудительного выделения JVM всей памяти). Для дальнейшей защиты от оптимизации JVM я активно выделяю число X для объектов размером 10 МБ. Я провел ряд тестов на нескольких JVM, увеличивая значение XMX вместе с увеличением количества выделенных МБ, в разных 32-битных операционных системах, использующих как Sun, так и IBM JVM, вот сводка результатов:

ОС: Windows XP SP2, JVM: Sun 1.6.0_02, максимальный размер кучи: 1470 МБ
ОС: Windows XP SP2, JVM: IBM 1.5, максимальный размер кучи: 1810 МБ
ОС: Windows Server 2003 SE, JVM: IBM 1.5, максимальный размер кучи: 1850 МБ
ОС: Linux 2.6, JVM: IBM 1.5, максимальный размер кучи: 2750 МБ

Вот подробные попытки выполнения вместе с исходным кодом помощника класса выделения:

WinXP SP2, SUN JVM:

C:>java -version
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b06)
Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode)</p>

<p>java -Xms1470m -Xmx1470m Class1 142
...
about to create object 141
object 141 created</p>

<p>C:>java -Xms1480m -Xmx1480m Class1 145
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
WinXP SP2, IBM JVM
C:>c:\ibm\jdk\bin\java.exe -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pwi32devifx-20070323 (if
ix 117674: SR4 + 116644 + 114941 + 116110 + 114881))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223ifx-2007
0323 (JIT enabled)
J9VM - 20070322_12058_lHdSMR
JIT  - 20070109_1805ifx3_r8
GC   - WASIFIX_2007)
JCL  - 20070131</p>

<p>c:\ibm\jdk\bin\java.exe -Xms1810m -Xmx1810m Class1 178
...
about to create object 177
object 177 created</p>

<p>C:>c:\ibm\jdk\bin\java.exe -Xms1820m -Xmx1820m Class1 179
JVMJ9VM015W Initialization error for library j9gc23(2): Failed to instantiate he
ap.  1820M requested
Could not create the Java virtual machine.
Win2003 SE, IBM JVM
C:>"C:\IBM\java" -Xms1850m -Xmx1850m Class1
sleeping for 5 seconds.
Done.</p>

<p>C:>"C:\IBM\java" -Xms1880m -Xmx1880m
 Class1
JVMJ9VM015W Initialization error for library j9gc23(2): Failed to instantiate he
ap.  1880M requested
Could not create the Java virtual machine.
Linux 2.6, IBM JVM
[root@myMachine ~]# /opt/ibm/java2-i386-50/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxi32dev-20060511 (SR2))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20060504 (JIT enabled)
J9VM - 20060501_06428_lHdSMR
JIT  - 20060428_1800_r8
GC   - 20060501_AA)
JCL  - 20060511a</p>

<p>/opt/ibm/java2-i386-50/bin/java -Xms2750m -Xmx2750m Class1 270</p>

<p>[root@myMachine ~]# /opt/ibm/java2-i386-50/bin/java -Xms2800m -Xmx2800m Class1 270
JVMJ9VM015W Initialization error for library j9gc23(2): Failed to instantiate heap.  2800M requested
Could not create the Java virtual machine.

Вот код:


import java.util.StringTokenizer;


public class Class1 {

        public Class1() {}

        private class BigObject {
                byte _myArr[];
                public BigObject() {
                        _myArr = new byte[10000000];
                }
        }
    public static void main(String[] args) {
                (new Class1()).perform(Integer.parseInt(args[0]));
        }
        public void perform(int numOfObjects) {
                System.out.println("creating 10 MB arrays.");
                BigObject arr[]  = new BigObject[numOfObjects];
                for (int i=0;i <numOfObjects; i++) {
                        System.out.println("about to create object "+i);
                        arr[i] = new BigObject();
                        System.out.println("object "+i+" created");
                }
                System.out.println("sleeping for 5 seconds.");
                try {
                Thread.sleep(5000);
                }catch (Exception e) {e.printStackTrace();}
                System.out.println("Done.");
    }

}
4 голосов
/ 13 июня 2009

Для большого файла я предлагаю вам использовать файл с отображенной памятью. Это не использует пространство кучи (или очень мало), поэтому максимальный размер кучи не должен быть проблемой в этом случае.

3 голосов
/ 14 июня 2009

Мы недавно портировали с Windows на Linux (из-за проблем с размером виртуальной машины).

Я слышал о множестве чисел, разбросанных в прошлом по размеру виртуальной машины Windows (1200, 1400, 1600, 1800). На наших Windows-серверах (2003), в нашей среде с нашими приложениями , ... Я никогда не использовал успешно более 1280 МБ. Кроме того, в нашем приложении появились проблемы с ГХ и ООМ.

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

Теперь у вас есть файл размером 900 МБ, что если размер файла увеличится до 1300 МБ? Что ты будешь делать?

У вас есть несколько вариантов

  1. Порт для Linux / Solaris. Для этого просто нужно аппаратное / программное обеспечение и то, что часто является простым упражнением по переносу.
  2. Используйте 64-битную Windows. Это, возможно, не освобождает от проблем GC - я слышал о разных рассказах с 64-битными vms.
  3. Перепроектируйте приложение, чтобы обрабатывать файл по-другому. Можете ли вы каким-то образом логически разделить файл, можете ли вы прочитать файл по частям и обработать его по-разному и т. Д.?

Другие люди, использующие OpenMap, возможно, сталкивались с этой проблемой. Можете ли вы воспользоваться их знаниями и не изобретать новые колеса?

2 голосов
/ 12 июня 2009

Как отмечается в вопросе, упомянутом в комментарии, существует практический лимит около 1200 МБ.

Однако описываемая вами ситуация имеет большую глубину, чем просто объем памяти.

Когда вы читаете двоичные данные размером 910 МБ и строите из них сетевые объекты (в отличие от простого обслуживания данных в виде массива байтов), вы в конечном итоге занимает гораздо больше памяти, чем 910 МБ. Разумной оценкой было бы то, что представление в памяти будет занимать вдвое больше памяти - это потому, что (1) каждый объект содержит дополнительный указатель (на класс объекта); и (2) есть много бухгалтерских данных. Например, если вы используете HashMap для управления своими объектами, в дополнение к каждому объекту вы также выделяете объект Map.Entry, который может легко потреблять 16 или 20 байт (зависит от реализации).

С другой стороны, все еще есть надежда: вам действительно нужно сохранить все 910 МБ в памяти? Разве вы не можете просто создать что-то, что читает данные лениво? В сочетании с WeakReferences я думаю, что вы можете справиться с этим.

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

В 32-битной Windows по умолчанию каждое приложение может использовать до 2 ГБ виртуального адресного пространства. Я думаю, это составляет -Xmx2048M. Однако, если у вас установлено больше ОЗУ, вы можете увеличить виртуальное адресное пространство до 3 ГБ, используя параметры времени загрузки.

В boot.ini вы можете создать новые параметры загрузки, такие как:

[boot loader]<br>
timeout=5<br>
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS<br>
[operating systems]<br>
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - magyar" /noexecute=optin /fastdetect /usepmtimer<br>
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - magyar 3GB" /noexecute=optin /fastdetect /usepmtimer /3GB /USERVA=2800<br>

Здесь, отрегулировав параметр / USERVA = 2800, вы можете настроить свой аппарат. Но имейте в виду, что некоторым конфигурациям не нравятся высокие значения в этом параметре - ожидайте сбои.

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