【问题标题】:JNI JVM in c++ not able to use allotted heap memoryC ++中的JNI JVM无法使用分配的堆内存
【发布时间】:2012-12-11 06:18:48
【问题描述】:
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 的堆内存大小。我们发现以上两种执行方式的区别如下。

使用 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);

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我已经编辑了我的原始帖子,请参阅更新说明:感谢您的回复。
    • AFAIK,当您从 C++ 启动 Java 时,它不会以与命令行相同的默认选项启动。我怀疑您缺少某些选项,必须提供这些选项才能充分发挥作用。由于从 C++ 启动 JVM 总是麻烦多多,所以我只使用命令行启动。
    • 我已经发布了 jvm 初始化代码。我错过了什么吗?。
    • 这些是我正在使用的设置我错过了什么吗?感谢您的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2017-01-04
    • 1970-01-01
    • 2011-06-17
    • 2014-02-11
    相关资源
    最近更新 更多