2023-01-21 274
问题的基本摘要是:
我如何最好地优化内存分配以给我通过JNI访问的DLL提供尽可能多的内存?我应该采取什么措施最小化,我应该采取什么措施来最大化等等.
系统:
在带有4 GB RAM的32位系统中运行JBOSS 6作为Windows 32服务.我确实知道,对Java堆的内存有最大的限制. JVM是 JRE1.6.0_26
服务:
在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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态