我们有一个客户在 RedHat Linux Server 5.6 (Tikanga) 和 IBM JVM 1.6 上使用 WebSphere 7.0。当我们查看操作系统的内存使用报告时,我们会看到非常高的数字,并且由于内存不足,操作系统在某些时候开始使用 SWAP 内存。另一方面,JConsole 图显示了内存的完全正常行为 - 堆大小会增加,直到按预期调用 GC,并且堆大小在正常周期中下降到 ~30%。非堆与预期的一样,并且大小非常恒定。
有谁知道这种额外的本机内存使用可以归因于什么?
我会检查您正在查看的是常驻内存而不是虚拟内存(后者可能非常高)
如果进行交换,即使是轻微的这也可能导致 JVM 在 GC 上停止很长时间。如果您的应用程序没有锁定几秒钟或几分钟,它可能没有交换(可能是另一个程序)
如果您的程序确实在使用本机内存,这很可能是由于您导入了本机库。如果您查看 /proc/{id}/mmap 这可能会给您一个线索,但更有可能必须检查您正在加载哪些本机库。
注意:如果你有很多线程,所有这些读取的堆栈空间可以加起来。如果可以的话,我会尽量将这些限制在最低限度,但是我已经看到有成千上万的 JVM,这会消耗本机内存。GUI 组件也可以使用本机内存,但我假设您没有这些。