gpt4 book ai didi

java - JVM 总内存通常为 64 MB 但有时只有 2 MB

转载 作者:行者123 更新时间:2023-11-30 09:59:12 26 4
gpt4 key购买 nike

我创建了一个 DLL,其中包含一个从 C# 代码调用的 JNI 函数。作为长时间运行的 GUI 应用程序的 C# 应用程序多次调用该函数。

我的 JNI 函数调用 JNI_GetCreatedJavaVMs .如果有零个 VM,则通过函数 JNI_CreateJavaVM() 创建一个,否则我的函数调用 AttachCurrentThread() .

然后我的函数调用FindClass()并从 JAR 文件加载类。

最后我在那个类上调用了一个方法。

在调用方法的java代码中,我首先调用方法totalMemory()并将结果写入日志文件。该方法然后执行一些其他操作。

通常方法 totalMemory() 返回一个大约 6600 万的值,即大约 64 MB,但有时它返回大约 200 万,即 2MB。当 totalMemory() 只有 2 MB 时,我的 java 方法抛出 OutOfMemoryError (java 堆空间)因为没有足够的内存来分配我的 java 方法需要做的对象。

请注意,我的 java 方法包含 catch (Throwable),以便 C# 应用程序可以继续。在 OutOfMemoryError 之后,对于我的 JNI 函数的后续调用,totalMemory() 将再次返回 64 MB 的值。

什么会导致分配给 JVM 的总内存从 64 MB 下降到 2 MB?

请注意,我指的是总内存而不是空闲内存。我假设总内存不应该改变。我相信我的日志文件证明了我的假设,因为正如我上面所写的,它几乎总是 64 MB。它只是有时下降到 2 MB,因此这个问题。为什么总内存有时会下降到 2 MB?

我的(精简版)JNI 代码。

#include <jni.h>

void main()
{
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
jint rslt;
jclass cls;
jmethodID mid;
jobject jObj;

JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=jni_test.jar";

vm_args.version = JNI_VERSION_1_10;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;

rslt = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
cls = env->FindClass("jni_test/JniTest0");
mid = env->GetStaticMethodID(cls, "getReply", "()Ljava/lang/String;");
jObj = env->CallStaticObjectMethod(cls, mid);
}

在上述 JNI 代码中调用的我的(精简的)java 方法。

public static String getReply() {
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("total memory = " + totalMemory);
String reply = "That is the correct answer! Well done!";
return reply;
}

最佳答案

就我对JVM内存模型的理解:

maxMemory 是 JVM 可以使用的最大内存量(由 -Xmx 定义)

maxMemory = totalMemory + 未分配内存

totalMemory - freeMemory = 已使用

虽然很少(afaik)看到 JVM 将内存释放回操作系统,这是可能的,并且会解释您正在经历的事情。

totalMemory 不应低于 -Xms 定义的值,所以用固定的内存值运行你的 jvm,可能会解决你的问题。例如:-Xms64m -Xmx64m

关于java - JVM 总内存通常为 64 MB 但有时只有 2 MB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59105869/

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