c++中的JNI JVM无法使用分配的堆内存

JNI JVM in c++ not able to use allotted heap memory

本文关键字:分配 内存 中的 JNI JVM c++      更新时间:2023-10-16
i am calling java code in c++ using jni ,i alloted 60GB as max heap memory ,but while running its using less memory because of that its taking much time .

我使用的是windows7操作系统VS2008。

与我使用控制台运行java相同的是,它使用分配的内存,并且做得很快你能帮我摆脱困境吗。

更新说明:

我们有一个内存密集型的java应用程序,我们通过以下两种方式进行了尝试。

1.来自使用JNI的c++应用程序。

2.通过命令提示符直接执行。

在这两种情况下,我们都为jvm分配了60GB的堆内存大小。我们发现上述两种执行方法之间存在以下差异。

1.使用JNI的c++应用程序的内存可达40GB。(执行缓慢)

2.通过命令提示符执行,内存达到60GB左右。(快速执行)

内存使用率差异的原因可能是什么??。

jVM初始化:

JavaVMInitArgs vm_args;
JavaVMOption options[3];
options[0].optionString = "-Djava.class.path=c:\Application\bin-7.0\morpher\app.jar;";
options[1].optionString = "-Xms1024m";
options[2].optionString = "-Xmx50000m";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

用这样的措辞回答你的问题是不可能的,但我可以告诉你。

  • 您可以非常快速地分配堆,每秒400多MB的非常小的对象。对于大型物体,速度要快得多
  • 您可能会发现,通过减少触发的GC数量,增加eden大小可以提高分配对象的速率
  • 堆收集可能会减慢您的速度。我建议通过使用ByteBuffers和内存映射文件将大量数据放在本机内存中,来增加eden的大小,同时减少堆
  • 您可以在几秒钟或更短的时间内连接500 GB的内存映射文件
  • 如果您正在创建成百上千万个对象,那么值得重新考虑您的设计,以减少对象的数量,例如使用基于列的表而不是基于行的表。(您可能只有几十列,但数百万行和创建几十个数组比创建数百万对象更快)