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

时间:2012-12-11 06:18:49

标签: java c++ java-native-interface

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,它正在使用allottted内存,并快速执行 你可以帮我解决这个问题。

更新说明:

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

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

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

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

使用JNI的1.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);

1 个答案:

答案 0 :(得分:1)

回答你的问题是不可能的,但我可以告诉你。

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