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操作系统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的内存映射文件
- 如果您正在创建成百上千万个对象,那么值得重新考虑您的设计,以减少对象的数量,例如使用基于列的表而不是基于行的表。(您可能只有几十列,但数百万行和创建几十个数组比创建数百万对象更快)
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?