Java应用程序通过JNI调用C ++ DLL;如何最好地分配内存?

 2023-01-21    274  

问题描述

问题的基本摘要是:
我如何最好地优化内存分配以给我通过JNI访问的DLL提供尽可能多的内存?我应该采取什么措施最小化,我应该采取什么措施来最大化等等.

系统:
在带有4 GB RAM的32位系统中运行JBOSS 6作为Windows 32服务.我确实知道,对Java堆的内存有最大的限制. JVM是 JRE1.6.0_26

Java应用程序通过JNI调用C ++ DLL;如何最好地分配内存?

服务:
在JBOSS下安装的是一个WebApp,它从客户端接收请求;每个请求调用C ++ – 通过JNI构建的DLL以某种方式或其他方式处理图像文件.

问题:
有时,使用较大或某些(不是全部)LZW压缩图像,调用Java类会收到一条消息,即DLL经历了全局内存耗竭,并且未能完成所请求的过程.

除了基本的Windows进程之外,服务器上没有其他积极运行的.

当前的JBOSS应用程序服务器内存设置如下,但可能过多:

-XMS1024M -XMX1024M -XSS1024K -XX:MAXPERMSIZE = 128M

我正在尝试确定最佳的内存设置,以便为JNI DLL提供尽可能多的资源,因为我知道JNI不使用分配给Java Heap的任何内存.

我已经阅读了这些,但没有发现它们有助于回答我的问题:

java jni:内存分配/分配

可以用来使用jconsole标识JNI C ++对象中的内存泄漏?

当前提供的两个答案无法解决本质的问题.

JBOSS服务器的当前内存在一周之后,将JVM参数设置为上述(TaskManager指示Java.exe进程750,672K)

Total Memory Pools: 5

Pool: Code Cache (Non-heap memory)

    Peak Usage : init:2359296, used:7317312, committed:7438336, max:50331648
    Current Usage : init:2359296, used:7306496, committed:7438336, max:50331648


        |---------| committed:7.09Mb
        +---------------------------------------------------------------------+
        |/////////| | max:48Mb
        +---------------------------------------------------------------------+
        |---------| used:6.97Mb


Pool: PS Eden Space (Heap memory)

    Peak Usage : init:268500992, used:354811904, committed:354811904, max:355991552
    Current Usage : init:268500992, used:270153472, committed:354091008, max:354156544


        |--------------------------------------------------------------------| committed:337.69Mb
        +---------------------------------------------------------------------+
        |///////////////////////////////////////////////////// || max:337.75Mb
        +---------------------------------------------------------------------+
        |----------------------------------------------------| used:257.64Mb


Pool: PS Survivor Space (Heap memory)

    Peak Usage : init:44695552, used:44694896, committed:78643200, max:78643200
    Current Usage : init:44695552, used:0, committed:1835008, max:1835008


        |---------------------------------------------------------------------| committed:1.75Mb
        +---------------------------------------------------------------------+
        | | max:1.75Mb
        +---------------------------------------------------------------------+
        | used:0b


Pool: PS Old Gen (Heap memory)

    Peak Usage : init:715849728, used:123671968, committed:715849728, max:715849728
    Current Usage : init:715849728, used:104048648, committed:715849728, max:715849728


        |---------------------------------------------------------------------| committed:682.69Mb
        +---------------------------------------------------------------------+
        |////////// | max:682.69Mb
        +---------------------------------------------------------------------+
        |---------| used:99.23Mb


Pool: PS Perm Gen (Non-heap memory)

    Peak Usage : init:16777216, used:91989664, committed:134217728, max:134217728
    Current Usage : init:16777216, used:90956472, committed:90963968, max:134217728


        |----------------------------------------------| committed:86.75Mb
        +---------------------------------------------------------------------+
        |//////////////////////////////////////////////| | max:128Mb
        +---------------------------------------------------------------------+
        |----------------------------------------------| used:86.74Mb

推荐答案

由JNI包裹的本机代码分配的内存分配给JVM进程,但不受Java代码的控制.它不是堆的一部分,也不能通过JVM参数调谐.基本上,必须通过该本机代码来管理用本机Malloc分配的任何内容.如果您要控制所使用的库,则必须通过它并检查资源泄漏.如果在长期存在的过程中使用它,这一点尤其重要.

根据我的经验,最好的方法是通过拉出JMX统计信息来检查您的实际记忆使用.一旦您了解了Java应用程序消耗多少内存,您就可以更好地了解在哪里设置最大堆设置. permgen空间用于类定义,因此,除非您正在进行一堆动态类加载,否则您真的不需要太多的内存.

虽然您无法调整可用于JNI库的内存,但请调整为您的堆保留的内存,并且可能会释放库的资源.

正如预期的那样,将堆内存峰添加在一起,大约为1022.19(堆的最大尺寸).当堆耗尽时,全GC的跑步将被启动,并收回了脏堆.根据您提供的数字,我建议从XMX512M开始.这将使您的JNI代码室呼吸.

如果您发现JVM由于垃圾收集过多而撞击,这意味着您的Java堆量过快,则可以种植该分配.但是,如果它足够迅速地吞噬了512MB以引起明显的性能影响,那么除了显着增加的任何事情都不会产生很大的影响.这一切都在很大程度上取决于您的程序,饮食java堆的速度以及全GC运行的效果.

以上所述是小编给大家介绍的Java应用程序通过JNI调用C ++ DLL;如何最好地分配内存?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26212.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。