线上内存溢出问题排查<实践篇> 转
一、概述
之前写过 《性能的一些常用的命令与注意点》、《java jvm内存结构(回顾)》、 《JVM内存回收机制及回收器-一目了然》 等篇文章,今天写下实践吧,比较简单。 也正好前几天出现一个内存的问题。
二、线上准备数据
线上服务器跑得好好,突然服务不可用了,怎么办?1、登陆服务器,立马从LB拉下。2、快速jps,jstat -gcutil 12345看下。3、如果是内存溢出再down(jmap -dump:live,format=b,file=heap.bin 32471)出堆分析,同时打出线程栈。4、重启。5、拉上f5。当然事先配置一些参数,让系统出现内存溢出的时候自动打出堆栈(-XX:+HeapDumpOnOutOfMemoryError),也是非常好的办法。
如果是整个集群出现问题,那把别的机器全部重启,留一台分析。如果实在不行,那就只能回滚代码了。
【ps:如果是内存出现问题,一般很少直接挂掉,回收线程还在做最后的挣扎,cpu利用率也非常高。整个load也上去了。整个jvm就会挂在哪里,一动不动了。 估计也不会自动打出堆栈了,还得手工上弄啊。】
三、线下分析
我一般使用mat(http://www.eclipse.org/mat/)(mat的堆开大点,默认的会内存溢出的)分析堆:此是此次故障down下来的 用mat分析的 图形。
再从 Dominator tree进去,发现
展开后:发现是此线程持有的一些数据:再从数据中寻找 是什么原因引起的。(一般都能查到问题的)
可以看到整个对象的具体数值:
四、最后
分析好原因后,该干嘛就干嘛吧! 基本是代码写的不好、一些接口没有做幂等控制的。
相关推荐
在Java开发过程中,内存溢出(Out Of Memory,简称OOM)是常见的问题之一,它会导致应用程序崩溃或性能急剧下降。本文将详细探讨一个线上出现的OOM问题,以及如何通过日志分析、使用Eclipse的Memory Analyzer Tool...
- **故障排查**:当系统出现异常,如死锁、内存溢出等问题时,VJTop可以提供详细的堆栈信息,辅助开发者找到问题根源。 - **日常监控**:VJTop适合集成到持续集成/持续部署(CI/CD)流程中,作为性能指标的一部分,...
- 内存使用考量:分析了出现内存溢出错误的原因,并提出了如何优化分配给Java虚拟机的内存。 7. 常见问题解答(FAQ) - 乱码或查不到结果的排查方法:给出了排查此类问题的多种方法。 综合这些内容,可以看出这份...
- **性能优化**:合理设计数据库索引,避免内存溢出,减少不必要的数据库查询。 5. **学习资源** - **Java官方文档**:学习基础语法和API。 - **Spring框架文档**:了解Spring的核心特性。 - **MyBatis官方文档...
3. 性能优化:合理设计数据库索引,避免内存溢出,使用缓存技术提高响应速度。 4. 日志监控:记录系统运行日志,便于故障排查和性能分析。 综上所述,"产品信息发布与在线订购系统"是一个涵盖多方面技术的综合性...
- **6.10.1 OutOfMemory Errors**:避免内存溢出错误的策略。 - **6.10.2 Memory allocated to the Java VM**:合理分配给Java虚拟机的内存大小。 #### 七、FAQ - **7.1 出现乱码或者查不到结果的排查方法**:...