在 Linux 上运行 HBase 出现内存溢出(OOM,Out Of Memory),通常不是“HBase 本身有 bug”,而是内存分配不合理 + 系统/配置限制 + 使用方式共同导致。下面按常见原因 → 表现 → 解决思路系统说明。
现象
java.lang.OutOfMemoryError: Java heap space原因
-XX:HeapSize / HBASE_HEAPSIZE 设置太大
例如:
✅ 建议
现象
dmesg 中 OOM Killer)原因 HBase 使用:
这些 不走 JVM 堆
✅ 解决
export HBASE_OFFHEAPSIZE=4G
并在 hbase-site.xml:
<property>
<name>hbase.bucketcache.size</name>
<value>4096</value>
</property>
现象
Cannot allocate memory检查
ulimit -a
重点看:
max memory sizevirtual memory✅ 解决
vi /etc/security/limits.conf
hbase soft memlock unlimited
hbase hard memlock unlimited
或用 systemd:
[Service]
LimitMEMLOCK=infinity
现象
原因
hbase.hregion.memstore.flush.size 太大✅ 建议
hbase.hregion.memstore.flush.size = 128M
hbase.regionserver.global.memstore.size = 0.4
现象
✅ 建议
hfile.block.cache.size = 0.2 ~ 0.4
不要和 MemStore 加起来 > 0.8
Linux 会大量使用 Page Cache
如果 HBase 堆太大 → HDFS 没缓存 → 磁盘 IO 暴涨 → GC 增多 → OOM
✅ 原则
给 OS 留至少 20%~30% 内存
检查是否被系统杀掉
dmesg | grep -i oom
或:
journalctl -k | grep -i kill
✅ 说明:
# 看是否被 OOM Killer 杀
dmesg -T | grep -i oom
# 看内存使用
free -h
top
htop
# 看 JVM 内存
jstat -gcutil <pid> 1000
# 看 HBase 日志
tail -f hbase-hbase-regionserver-*.log
机器:32G
JVM Heap: 16G
Off-Heap: 4G
OS / HDFS: 12G
hbase-env.sh
export HBASE_HEAPSIZE=16G
export HBASE_OFFHEAPSIZE=4G
HBase 在 Linux 内存溢出,90% 是因为“堆 + 堆外 + 系统”没算总账。
如果你愿意,可以:
我可以直接帮你算一套安全内存配置。