1. 程式人生 > >kafka 0.9版本堆外記憶體溢位

kafka 0.9版本堆外記憶體溢位

1、背景

線上kafka是0.9版本,最大堆記憶體1G。

從server.log看到,java.lang.OutOfMemoryError: Direct buffer memory,是堆外記憶體溢位了。

加大堆外記憶體,過一段時間還是堆外記憶體溢位。

2、原因分析

猜測應該是禁用了手動 GC 導致的,同事升級kafka版本到1.0,沒有再重現過。

我看了kafka 0.9版本的啟動指令碼,確實禁用了手動GC(-XX:+DisableExplicitGC)。

申請堆外記憶體的時候,會呼叫System.gc();,-XX:+DisableExplicitGC 會導致 System.gc(); 失效,然後就記憶體溢位了。

參考連結

3、解決方案

a.升級kafka版本到1.0,

b.或者去掉-XX:+DisableExplicitGC,如果使用ConcurrentMarkSweep(CMS)垃圾回收器,可以改成 -XX:+ExplicitGCInvokesConcurrent,把FullGC變成併發的。

4、思考

kafka作為全球著名的開源軟體,也存在過這樣的問題,說明偉大的軟體也是一步一步進化的。

勇敢的參與到開源大潮中去吧,我輩也可以添磚加瓦,並從中學習進步。