2

多くの -Xmx を割り当てると、最も珍しい種類の問題が発生するという問題があります。

問題: 64 ビット Linux OS 上の 32 ビット JVM で -Xmx を 3072m に設定すると、サーブレットが JNI IPC を介して多くの外部エンティティと通信しようとする 1 つの条件を除いて機能します。-Xmx を 2048m に下げると、機能します。tomcat 内でエラーが発生することはありません。表示される唯一のエラーは、JNI ロギング コード内です。

これは、これが 32 ビット プロセスであるため、最大 Java ヒープ スペースを 3072m に設定すると、JNI C++ ネイティブ コード用のスペースがほとんどなくなると私に思わせます。スレッドなどに十分なスペースを割り当てることができません。

私は調査しました: 64 ビット OS 上の 32 ビット JVM の最大 Java ヒープ サイズですが、これは私が求めているものではありません。

質問:

32 JVM で -Xmx を高く設定すると、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 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
4

1 に答える 1

4

はい。
メモリ ヒープが大きいほど、ネイティブ ヒープは小さくなります。ここで言及

オペレーティング システムによって Java プロセスに提供されるメモリ領域は、オペレーティング システムによって異なり、Java ヒープとネイティブ ヒープという 2 つの別個のメモリ領域に使用されます。オペレーティング システムによって提供されるメモリ量は有限であり、そのメモリは 2 つのヒープ間で共有されるため、-Xmx 設定を使用して Java ヒープに割り当てられるメモリ量が大きくなるほど、ネイティブ ヒープは小さくなります。ネイティブ ヒープが小さすぎると、Java ヒープと同様に、使い尽くされたときに OutOfMemoryError が発生します。

オラクルにも当てはまります。
64 ビット OS を使用しているという事実は関係ありません。32 ビット JVM を使用しているため、メモリが制限されている

于 2013-09-18T22:09:43.843 に答える