gpt4 book ai didi

java - 是否有可能在 32 JVM 上将 -Xmx 设置为高可以缩小 JNI 可用的空间,从而导致 JNI 失败?

转载 作者:太空狗 更新时间:2023-10-29 11:45:31 25 4
gpt4 key购买 nike

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

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

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

我调查过:Maximum Java heap size of a 32-bit JVM on a 64-bit OS这不是我要问的。

问题:

是否有可能在 32 位 JVM 上将 -Xmx 设置为高值会缩小 JNI 可用的空间,从而导致失败?对于给定的情况,我们如何确定该 JNI 进程可用的内容?

已知列表:

Linux 64 位HCOS-130:~ # uname -aLinux 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

最佳答案

是的。
内存堆越大, native 堆变得越小。提到here

The memory space provided by the operating system to the Java process varies by operating system and is used for two separate memory areas: the Java heap and the native heap. Because a finite amount of memory is provided by the operating system, and that memory is shared between the two heaps, the larger the amount of memory that is allocated to the Java heap, using the -Xmx setting, the smaller the native heap becomes. If the native heap is too small, an OutOfMemoryError occurs when it is exhausted, in the same way as for the Java heap.

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

关于java - 是否有可能在 32 JVM 上将 -Xmx 设置为高可以缩小 JNI 可用的空间,从而导致 JNI 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18883134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com