Подтвердить что ты не робот

Java -Xmx, максимальная память в системе

В моем приложении Java выполняется другое приложение Java, запустив процесс "java -jar j.jar". Известно, что Jjar использует много памяти в зависимости от набора данных, который он задает, и часто получает кучу OutOfMemoryError. Поэтому я хочу использовать -Xmx на нем, чтобы я мог выделить как можно больше памяти (или близко к ней). Я думал о том, чтобы получить полную память в системе, а затем указать 80-90% от того, что в -Xmx.

Есть ли какое-либо решение моей проблемы? И как звучит мое решение?

Изменить: я не могу уменьшить потребление памяти, так как используемая память используется встроенным сжатием Java pack200, которое я использую для упаковки некоторых файлов JAR.

4b9b3361

Ответ 1

В зависимости от вашей ОС это может работать для получения свободного и доступного объема памяти:

java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean();
com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean;
long freeMemory = sunmxbean.getFreePhysicalMemorySize();
long availableMemory = sunmxbean.getTotalPhysicalMemorySize();

Оттуда вы можете найти 80-90% и запустить свою банку с максимальным размером памяти.

Я не знаю, что это работает со всеми ОС (то есть Windows), но это сработало, когда я тестировал его как с OSX, так и с Linux.

Ответ 2

Предел для -XmX равен -Xmx1500m на 32-битных окнах. Общие библиотеки мешают большой куче. Для этого вам понадобится около 2 ГБ ОЗУ.

В не-Windows-ОС вы можете увеличить размер, а 64-битные JVM способны более LOT больше.

Windows XP не позволит вам иметь более 3 Гбайт оперативной памяти (все равно, если у вас 4Gb физический, с XP SP3) Vista может отличаться от YMMV.

Я пробовал -Xmx4000M на 64-битной JVM на 64-битной Linux, и все было в порядке. учитывая, что у меня 6 ГБ физического барана, это был не большой запрос.

Ваша идея 80% интересна, но мои тестовые системы имеют более высокий процент, чем без негативного эффекта. (Пока вы не пытаетесь сделать что-нибудь еще.)

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

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

Ответ 4

Хорошо, одно могу сказать вам, не позволяйте вашему приложению приблизиться к заполнению барана. Приложения Java не обмениваются графически. Я думаю, из-за Garbage Collection java постоянно извлекает из памяти свою память.

Я столкнулся с тупиком, где, как я думаю, система запрашивала java для памяти, которая могла бы вызвать GC и вытащить материал из файла подкачки - в этот момент система просто начнет вращаться, пока не будет reset.

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

Кроме того, в зависимости от того, как вы запускаете это приложение, вам может потребоваться указать -Xms для вашего приложения, а не другое. Если вы даете ему полную команду, дайте ей -Xms, но если вы просто вызываете основной класс в банке, то вашему приложению требуется -Xms. (О, вы указали, что вам нужно передать его в команду "Java", которую вы вызываете.)

Ответ 5

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

Ответ 6

Существует полное сообщение в блоге об устранении неполадок java-приложений с помощью jconsole и других инструментов в следующем блоге. Имейте в виду, что отсутствие контроля над использованием памяти, скорее всего, является утечкой памяти, но это может быть связано и с другими причинами. Взгляните на сообщение, попробуйте воспроизвести этот сценарий и посмотрите, решила ли ваша проблема.

http://www.kiragiannis.com/cloud-computing/debug-a-java-application-in-the-cloud/

Ответ 7

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

JProfiler довольно изящный, но вы можете получить ту же информацию с помощью HPROF, которая была представлена ​​на Java 5: http://java.sun.com/developer/technicalArticles/Programming/HPROF.html p >

Помните также, что разные платформы имеют разные максимальные размеры кучи, основанные на архитектуре (32-разрядная и 64-разрядная), ОС и даже JVM.

Если у вас есть много значений, которые могут быть повторно использованы (например, строки, которые вы читаете из XML файла), вы можете получить огромное снижение требований к памяти путем объединения ваших объектов.