繁体   English   中英

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

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

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 OS,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和内存映射文件将大量数据放在本地内存中来减少堆。
  • 您可以在几秒钟或更短的时间内附加500 GB的内存映射文件。
  • 如果要创建数百或数百万个对象,则值得重新考虑设计以减少对象数量,例如使用基于列的表而不是基于行的表。 (您可能只有几十列,但是数百万行和创建数十个数组要比创建数百万个对象快)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM