2

我有一个问题,分配给很多 -Xmx 会导致最不寻常的问题。

问题:在 64 位 Linux 操作系统上的 32 位 JVM 上将 -Xmx 设置为 3072m 有效,除了 servlet 尝试通过 JNI IPC 与许多外部实体通信的一种情况。当我们将 -Xmx 降低到 2048m 时,它可以工作。从未在tomcat中看到任何错误。可以看到的唯一错误是在 JNI 日志记录代码中。

这让我相信,由于这是一个 32 位进程,将最大 java 堆空间设置为 3072m 为 JNI C++ 本机代码留下了很小的空间。它无法为..线程或其他任何东西分配足够的空间。

我调查过:64 位操作系统上 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 堆和本机堆。因为操作系统提供了有限的内存量,并且该内存在两个堆之间共享,所以分配给 Java 堆的内存量越大,使用 -Xmx 设置,本机堆就越小。如果本机堆太小,则在耗尽时会发生 OutOfMemoryError,与 Java 堆相同。

它也适用于 Oracle。
您使用的是 64 位操作系统这一事实无关紧要。您使用的是 32 位 JVM,因此内存受限

于 2013-09-18T22:09:43.843 回答