У меня есть проблема, когда выделение большого -Xmx вызывает проблему самого необычного вида.
Эта проблема:
Установка -Xmx на 3072m в 32-битной JVM в 64-битной ОС Linux работает, за исключением одного условия, когда сервлет пытается установить связь со многими внешними объектами через JNI IPC. Когда мы понижаем -Xmx до 2048m, это работает. Никаких ошибок внутри кота не замечено. Единственные ошибки, которые замечены, находятся в пределах кода регистрации JNI.
Это наводит меня на мысль, что, поскольку это 32-битный процесс, установка максимального размера кучи Java на 3072 м оставляет мало места для собственного кода JNI C ++. Он не может выделить достаточно места для .. потоков или чего-то еще.
Я исследовал: Максимальный размер кучи Java для 32-разрядной JVM в 64-разрядной ОС и это не то, что я спрашиваю.
Вопрос:
Возможно ли, что установка -Xmx на 32 JVM на высокий уровень может уменьшить пространство, доступное для JNI, так, что он потерпит неудачу? Как мы можем определить для данной ситуации, что доступно для этого процесса JNI?
Список известных:
Linux 64bit
HCOS-130: ~ # uname -a
Linux HCOS-130 2.6.27.19-5-default # 1 SMP 2009-02-28 04:40:21 +0100 x86_64 x86_64 x86_64 GNU / Linux
java 6 32bit jre1.6.0_45
CATALINA_OPTS = «- сервер -Xmx3072m -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath = $ CATALINA_HOME / logs»
PS Aux | grep -i jsvc
root 19827 0.0 0.0 2344 368 ? Ss 17:32 0:00 jsvc.exec -user tomcat -home /usr/java/jre1.6.0_45 -Dcatalina.home=/usr/java/apache-tomcat -Djava.security.auth.login.config=/usr/java/apache-tomcat/conf/jaas.conf -Djavax.net.ssl.trustStore=/usr/java/apache-tomcat/conf/truststore.ks -Djavax.net.ssl.trustStorePassword=changeit -Djava.awt.headless=true -Djava.io.tmpdir=/usr/java/apache-tomcat/temp -Djavax.net.ssl.trustStore=/usr/java/apache-tomcat/conf/truststore.ks -Djavax.net.ssl.trustStorePassword=changeit -outfile /usr/java/apache-tomcat/logs/catalina.out -errfile /usr/java/apache-tomcat/logs/catalina.err -server -Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/java/apache-tomcat/logs -cp /usr/java/apache-tomcat/conf:/usr/java/apache-tomcat/bin/bootstrap.jar:/usr/java/apache-tomcat/bin/commons-daemon.jar:/usr/java/apache-tomcat/bin/tomcat-juli.jar:/usr/java/apache-tomcat/shared/lib/jni.jar:/usr/java/apache-tomcat/shared/lib/log4j-1.2.14.jar:/usr/java/apache-tomcat/shared/lib/dhcajni.jar:/usr/java/apache-tomcat/shared/lib/activejni.jar org.apache.catalina.startup.Bootstrap
tomcat 19829 1.5 0.1 2863864 162164 ? Sl 17:32 0:10 jsvc.exec -user tomcat -home /usr/java/jre1.6.0_45 -Dcatalina.home=/usr/java/apache-tomcat -Djava.security.auth.login.config=/usr/java/apache-tomcat/conf/jaas.conf -Djavax.net.ssl.trustStore=/usr/java/apache-tomcat/conf/truststore.ks -Djavax.net.ssl.trustStorePassword=changeit -Djava.awt.headless=true -Djava.io.tmpdir=/usr/java/apache-tomcat/temp -Djavax.net.ssl.trustStore=/usr/java/apache-tomcat/conf/truststore.ks -Djavax.net.ssl.trustStorePassword=changeit -outfile /usr/java/apache-tomcat/logs/catalina.out -errfile /usr/java/apache-tomcat/logs/catalina.err -server -Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/java/apache-tomcat/logs -cp /usr/java/apache-tomcat/conf:/usr/java/apache-tomcat/bin/bootstrap.jar:/usr/java/apache-tomcat/bin/commons-daemon.jar:/usr/java/apache-tomcat/bin/tomcat-juli.jar:/usr/java/apache-tomcat/shared/lib/jni.jar:/usr/java/apache-tomcat/shared/lib/log4j-1.2.14.jar:/usr/java/apache-tomcat/shared/lib/dhcajni.jar:/usr/java/apache-tomcat/shared/lib/activejni.jar org.apache.catalina.startup.Bootstrap
Да.
Чем больше куча памяти, тем меньше становится родная куча. упомянутый Вот
Пространство памяти, предоставленное операционной системой для процесса Java
зависит от операционной системы и используется для двух отдельных областей памяти:
куча Java и родная куча. Потому что конечный объем памяти
предоставляется операционной системой, и эта память распределяется между
две кучи, тем больше объем памяти, выделенной для
куча Java, используя параметр -Xmx, тем меньше собственная куча
становится. Если собственная куча слишком мала, возникает ошибка OutOfMemoryError
когда он исчерпан, так же, как для кучи Java.
Это относится и к Oracle.
Тот факт, что вы работаете в 64-битной ОС, не имеет значения. Вы используете 32-битную JVM и в результате ограничены в памяти
Других решений пока нет …