该文讲述了一个Java应用从8升级到11后,因堆外内存泄漏导致容器OOM的问题。根因是JavaCV库未显式释放原生内存,依赖GC兜底,而旧GC高频回收掩盖了泄漏,新G1回收不频繁导致内存累积。作者总结教训:堆外泄漏监控难察觉,隐性兜底可能掩盖问题,native资源应显式释放。
最近进行java应用压力测试时发现内存使用率从20%上升到100%,tps从1100多降低到600多。经排查发现是堆外内存泄漏导致的。通过google-perftools工具分析发现是Java_java_util_zip_Inflater_init函数一直在进行内存分配,原因是jimdb客户端使用了gzip解压缩功能,在大并发压测时造成内存泄漏。解决方法是升级jdk版本为jdk7u71,并尽量避免使用jimdb客户端的getObject和setObject方法,或设置解压缩阀值。
完成下面两步后,将自动完成登录并继续当前操作。