Возможно ли, что установка -Xmx на высокий уровень на 32 JVM может уменьшить пространство, доступное для JNI, так что JNI выйдет из строя?

У меня есть проблема, когда выделение большого количества -Xmx вызывает проблему самого необычного рода.

Проблема: установка -Xmx на 3072m на 32-битной JVM в 64-битной ОС Linux работает, за исключением одного условия, когда сервлет пытается взаимодействовать со многими внешними объектами через JNI IPC. Когда мы уменьшаем -Xmx до 2048m, это работает. Никаких ошибок в tomcat никогда не наблюдается. Единственные ошибки, которые видны, находятся в коде регистрации 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 28.02.2009 04:40:21 +0100 x86_64 x86_64 x86_64 GNU/Linux

Java 6 32-битный jre1.6.0_45

CATALINA_OPTS="-server -Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs"

PS вспомогательный | 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

person D-Klotz    schedule 18.09.2013    source источник


Ответы (1)


Да.
Чем больше куча памяти, тем меньше становится собственная куча. Упоминается здесь

Объем памяти, предоставляемый операционной системой процессу Java, зависит от операционной системы и используется для двух отдельных областей памяти: кучи Java и собственной кучи. Поскольку операционная система предоставляет ограниченный объем памяти, и эта память совместно используется двумя кучами, чем больше объем памяти, выделенный для кучи Java с использованием параметра -Xmx, тем меньше становится собственная куча. Если собственная куча слишком мала, при ее исчерпании возникает ошибка OutOfMemoryError, как и для кучи Java.

Это относится и к Oracle.
Тот факт, что вы работаете в 64-разрядной ОС, значения не имеет. Вы используете 32-битную JVM и в результате ограничены в памяти

person Cratylus    schedule 18.09.2013
comment
Спасибо, я думаю, что это касается главного вопроса. - person D-Klotz; 19.09.2013