美文网首页程序员
记一次内存告警

记一次内存告警

作者: LieBrother | 来源:发表于2018-12-18 22:33 被阅读15次

个人博客原文:
记一次内存告警

hbase_logo_with_orca_largepng

今天给大家分享一次生产上遇到的内存问题。

生产上的一个应用经常运行一段时间后就内存告警,在一次告警中,先 dump 了内存下来,然后再重启了应用。

dump 命令:

jmap -dump:format=b,file=memory.pro {pid}

用 VisualVM 打开文件,看了一下,发现占用很高的是 java.nio.ByteBuffer[],点击多层引用进去发现是 HBase 连接,看起来很明显,大概知道是什么问题了,有 6 万多个连接对象,肯定是连接未释放导致的。

内存

到底是什么导致连接未释放? 看了公司内部封装的框架代码,操作 HBase 有使用 HTablePool,配置了队列数是 10,这就奇了怪了。为啥连接数还那么高?

只能通过 HBase 源代码来看个究竟,直到看了 HBase 的 HTablePool#getTable(),取出为空的话还会自动创建 HTable,说明配置队列数不是固定死的,还会自动创建的。当 HBase 操作慢的时候,存 HTable 的队列很容易就为空了,这个时候会额外创建 HTable,这时候怀疑额外创建的 HTable 没有释放资源,再继续看代码。

getTable

既然可以无限创建 HTable,那就得关注下存 HTable 到队列的代码了。看了 HTablePool#putTable() 代码发现,只是简单判断了队列没满,就把 HTable 放到队列,多余的 HTable 竟然啥都没处理,就这样堆积在内存中。

putTable

看了 HBase 版本,是可怜的 0.89 古老版,在新的版本这个问题都不存在了,下面是 0.98 版本,已经解决了这个问题,把多余的 HTable 回收了。

putTable

这个坑也是公司一直没升级 HBase 导致的。所以要跟得上开源的脚步,尽量用高的版本的开源框架。在没升级 HBase 的时候,只能根据业务,把 HTablePool 队列配置配高些,才会减少自动创建的 HTable。

公众号

相关文章

  • 记一次内存告警

    个人博客原文:记一次内存告警 今天给大家分享一次生产上遇到的内存问题。 生产上的一个应用经常运行一段时间后就内存告...

  • pika常见故障排查

    一、告警处理 1.内存告警 类型一、缓慢上涨到10G,可能出现内存泄露的情况。 类型二、 瞬间内存上涨到10G。 ...

  • JVM内存分配理解

    JVM进程内存疑惑 一段时间,老是收到服务器内存不够用的告警(运维设置的可用内存低于90%即告警),登录服务器查看...

  • nginx+php-fpm模式php内存泄漏探究

    昨天遇到过一次服务器内存告警,查看后发现有个php-fpm进程占用了2G的内存。但我明明在php.ini文件里面,...

  • grafana+prometheus+alertmanager监

    一、背景 由于前段时间业务服务器上cpu和内存告警频发,但无法有效地进行历史回溯分析;由此决定寻找一款方案,可以记...

  • 转载:探寻 Redis 内存诡异增长的元凶

    转载:探寻 Redis 内存诡异增长的元凶 记一次 Redis 内存诡异增长,由于 一次RedisRehash 造...

  • 记一次内存泄漏定位过程

    01 机器内存告警,查看jvm内存及gc情况 老年代占比接近90% S0 S1 E O ...

  • 小程序优化

    内存预警 小程序提供了监听内存不足告警事件的 API:wx.onMemoryWarning[23],旨在让开发者收...

  • ios开发使用for、while、do-while需要注意的地方

    使用for、while、do-while循环遍历数据量大的时候,出现内存使用率不断增加有可能直至内存告警,APP被...

  • ios内存告警的排查

    jetsam就像linux的oom,当物理上内存低的时候,操作系统根据某些策略,去找到一个进程,并且将这个进程 杀...

网友评论

    本文标题:记一次内存告警

    本文链接:https://www.haomeiwen.com/subject/mrvrkqtx.html