mmap句柄超過了系統(tǒng)默認最大值晒来。系統(tǒng)默認最大值可使用
cat /proc/sys/vm/max_map_count
查看钞诡,進程使用句柄數(shù)可使用
cat /proc/$PID/maps | wc -l
查看。每一塊申請的ByteBuffer都對應(yīng)一個mmap句柄湃崩,也就是說荧降,如果生成了大量的碎ByteBuffer,那么句柄數(shù)也會急劇增長攒读。而這些句柄的回收是伴隨著ByteBuffer回收的誊抛,堆外內(nèi)存的GC需要顯示調(diào)用System.gc來進行。
解決方式:
- 若為32-bit JVM整陌,可升級到64-bit拗窃,獲得更大的地址空間。
- 若為64-bit JVM泌辫,當超出堆外內(nèi)存不多且使用總內(nèi)存小于32GB時随夸,使用-XX:useCompressedOops來壓縮對象的空間大小。
- 調(diào)整-XX:maxDirectMemorySize來獲得更多的堆外內(nèi)存震放。
- 調(diào)整/proc/sys/vm/max_map_count宾毒。