组里的美女同事在搭建性能测试环境时遭遇了OutOfMemoryError,做Java,做性能遇到OOM本是常事,不过这次的原因还是第一次碰到,分享一下我们的思路:
- 确认OOM的具体类型。 一般来讲,OOM常见的有unable to create new native thread、Out of swap space、Java heap space、GC overhead limit execeeded、PermGen space,不同类型的分析处理思路不同。 本次OOM是其中最为常见的一种:java.lang.OutOfMemoryError: Java heap space
- 根据“Java heap space”类型,我的第一反应是确认JVM参数的正确性,于是让美眉check了一下Xmx参数,没问题,1536m
- 然后美眉准备用MAT分析heap dump文件(启动参数事先已设置了HeapDumpOnOutOfMemoryError),我这时注意到该dump file大小只有几十兆,于是建议放弃分析dump,意义不大
- 尝试jmap -histo多次采样来查看占用空间最多的对象类型,看到原生类型的占用较多,又是死胡同,ft
- 只好转向进一步分析应用log,在经过若干次尝试后,发现每次OOM时的stack trace很固定,都是形如:
java.lang.OutOfMemoryError: Java heap space
Caused by:
java.lang.OutOfMemoryError: Java heap space
at com.taobao.tair.packet.BasePacket.readString(BasePacket.java:73)
at com.taobao.tair.packet.ResponseGetGroupPacket.decode(ResponseGetGroupPacket.java:55)
at com.taobao.tair.comm.TairClient.invoke(TairClient.java:140)
at com.taobao.tair.impl.ConfigServer.retrieveConfigure(ConfigServer.java:116)
at com.taobao.tair.impl.DefaultTairManager.init(DefaultTairManager.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1237)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1203)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1167)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
…
于是大胆怀疑与tair相关,首先确认了tair server的健康状态后,结合最近搭建环境的变动,进一步怀疑到是配置文件中关于tair的配置相关,最终验证了这一猜想。
总结一下,OOM要根据具体问题具体分析,不要一味怀疑是应用代码或Xmx的问题。就像本次OOM中,曾求助相关应用开发人员,他一直在尝试调整Xmx参数大小,思路不对,甚至准备重新build部署应用…
相关推荐
主要给大家介绍了一次OOM问题排查过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
ha和mat两种工具,用来进行JVM堆内存分析
通常我们会添加对内存的监控报警,例如:当memory或swap使用超过90%时,触发报警通知,需要及时介入排查。 如果已经出现OOM,则可以通过dmesg命令查看,CentOS7版本以上支持 -T选项,能将时间戳转成时
OOM小例子,用于验证oom出现以及对应的问题排查
一个线程oom会影响其他线程吗1
图片oom,解决方法 图片oom,完美deom
用例图1.oom
Android例子源码仿oom的三例瀑布流源码
OOM分析工具-MemoryAnalyzer JVM dump分析利器
SurfaceView加载动画 解决OOM问题 多少帧都没问题 不会卡顿 不会卡顿
android解决OOM
防止下载图片的过程中产生OOM,当滚动的过程中停止下载!
加载大图片到内存时如何防止 OOM的产生
如果在Keras内部多次使用同一个Model,例如在不同的数据集上训练同一个模型进而得到结果,会存在内存泄露的问题。在运行几次循环之后,就会报错OOM。 解决方法是在每个代码后面接clear_session()函数,显示的关闭TF...
java jvm 中关于内存溢出分享,举例说明各种情况下可能会出现的oom事故
用LruCache解决OOM 并且可以下载多个相同地址的图片
介绍了android开发中OOM错误的原因。
JVM状态监控与OOM案例分析…… 简单认识,了解
安卓 OOM内存