1. 背景
在使用Kafka的過程中隨著集群規(guī)模與數(shù)據(jù)量的增長(zhǎng)大部分同學(xué)可能都會(huì)遇到OutOfMemoryError: Map failed異常翅敌,遇到此異常后通過修改系統(tǒng)參數(shù)max_map_count值解決榛臼。Kafka官網(wǎng)也明確提到部署Kafka集群時(shí)盡量把此系統(tǒng)參數(shù)調(diào)大寡键。筆者從【Java源碼層->JVM源碼層->系統(tǒng)源碼層】由淺入深偏陪、層層遞進(jìn)的方式向大家分享OutOfMemoryError: Map failed異常拋出的整個(gè)過程。image.png
2. 分析
【1】根據(jù)Map failed異常棧在sun.nio.ch.FileChannelImpl.map拋出的異常之所以在此處拋出是因?yàn)镵afka利用零拷貝技術(shù)來提高處理性能,其中索文件(Index)用MappedByteBuffer實(shí)現(xiàn),日志文件則用FileChannel.transferTo實(shí)現(xiàn)劣光。image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
3. 總結(jié)
經(jīng)過層層分析終于知曉在Kafka運(yùn)行過程中拋出OutOfMemoryError: Map failed異常并調(diào)整系統(tǒng)參數(shù) max_map_count值的整個(gè)來龍去脈云石。需要特別強(qiáng)調(diào)Linux系統(tǒng)函數(shù)do_mmap中包含多項(xiàng)安全檢查,只要任何一項(xiàng)檢查不通過都會(huì)拋出ENOMEM異常研乒,如果系統(tǒng)參數(shù)max_map_count調(diào)大后問題依然存在可自助查看該函數(shù)源碼并分析沒有通過安全檢查的原因留晚。