问题的基本总结如下: 如何最佳优化我的内存分配,以尽可能多地为我通过JNI访问的DLL提供内存? 我应该最小化什么,最大化什么等。
系统: 在具有4GB RAM的32位系统中作为Windows 32服务运行JBoss 6。我确实了解Java Heap的内存有最大限制。JVM是JRE1.6.0_26
服务: 安装在JBoss下的Web应用程序接收来自客户端的请求; 每个请求通过JNI调用C++构建的DLL以某种方式处理图像文件。
问题: 偶尔,在较大或某些(不是全部)LZW压缩的图像上,调用Java类会收到消息,指示DLL经历了全局内存耗尽并未能完成所请求的过程。
除了基本的Windows进程外,服务器上没有其他正在运行的内容。
当前的JBOSS应用程序服务器内存设置如下,但可能过多:
-Xms1024m -Xmx1024m -Xss1024k -XX:MaxPermSize=128m
我正在尝试确定最佳的内存设置,以便尽可能多地为JNI DLL提供资源,因为我了解JNI不使用分配给Java Heap的任何内存。
我已阅读以下内容,但没有找到有助于回答我的问题:
可以使用jconsole识别JNI C ++对象中的内存泄漏吗?
目前提供的两个答案都未解决基本问题。
JVM参数设置为上述值后一周后JBoss服务器的当前内存(任务管理器显示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
-Xms1024m -Xmx1024m -Xss1024k -XX:MaxPermSize=128m
。假设我不需要这些值像它们现在这样高(我受到32位架构的限制),我应该尽可能地降低Xms、Xmx和MaxPermSize的值以释放JNI,对吗?是否存在其他运行时参数,我可能要考虑包括,以可能增强进程堆分配?JVM是JRE1.6.0_26。 - JoshDM