OutOfMemoryError本地线程不足问题分析
java.lang.OutOfMemoryError本地线程不足问题
11月份中旬客户方的一个系统突然报内存异常,当时是早上上班的时候碰到该项目的项目经理,还跟该项目的项目经理开玩笑说你们系统上线将近8个月都没问题了,应该不会出现
系统故障等问题了吧,谁知刚说完,没半小时该项目经理突然给我打电话说,生产系统出现故障了,没办法使用了,原因为明。让我赶紧去客户方机房一起分析问题。
于是顾不上吃早餐,赶紧跑过去机房帮忙分析是什么故障问题。过去的时候发现客户方的领导以及公司的项目经理和几位开发人员以及合作公司的几位开发人员和领导也在那边围观在那边研究问题原因,看这架势问题估计很严重,不然怎么也会把合作公司的技术总监也叫上了。过去一听原委,原来系统有四个实例其中一个实例宕机,其他三个实例处于半死不活状态,也没办法正常运作,前端客户打电话反映没办法登录,或者登录进去打开页面都是异常信息等。我也很积极的投入他们围观中,一起分析问题发现后台日志一直刷屏似地的显示各种异常信息,看得眼花缭乱。
看了半天才看出一点眉目原来内存溢出,GC日志分析发现一直做大GC,而且还是做system.gc。客户方说明看能否尽快解决,而且客户方那边有规定,没有特殊情况下不能随意重启机器。
就是说白天在使用过程中,出现问题除非有修改东西之类的才能去重启机器,不能先重启让客户方立马使用,但是根据他们说,如果重启后不用一小时还是出现同样问题, 因为交易量很大,后台并发很多,程序代码有问题是肯定有的,不然不会出现此问题。一时半会儿我也定位不出哪里出问题,也不清楚怎么解决,看了日志问题,我也茫然了,犹豫了一会儿,我只能跟客户方说临时解决应急方案倒是有一个,但是不能只能治本不能治根,确保白天能正常使用,但是晚上凌晨还是要重启来缓解第二天的正常使用,至于能否完全解决,你们只能过会儿把日志文件等取过来我在静心分析下才能知道原因点。于是我就提供了修改方案,无非就是JVM配置问题新生代重新划分,而且禁用system。gc功能,然后客户方重启机器。就这样连续两天过去了,生产可以正常使用,但是后台还是时不时的报错,经过这两天的日志分析以及生产监控,发现主要问题是本地线程创建异常,其实就是线程使用不足引起的。根本原因是框架平台代码问题,修改此问题对系统的功能影响面很大,而且这个平台不是我们公司的是客户方买的一个平台,这意味着此问题没办法解决。思量了一天,说白了出事故后这两天,搞得我晚上都没办法睡觉,虽然可以说我可以不管这件事情,因为我只是测试人员,主要工作是做好部门管理,但是这毕竟我们公司的项目(虽然结项了),现在是我之前公司接了该项目,他们公司也派了开发人员和他们的技术总监参与分析解决问题,我们公司好歹也表个态比较以前也是我们做的项目,虽然接这个项目到结项没问题,但是突然在交接后立马出问题,也不能说是谁的问题,其实是平台的问题,两家公司都没责任,但是问题没人解决,这样也不好,大家都分析了两三天也没得出结论,而生产只是客户方暂时借用我的应急方案顶住,但是反映不是很好。
苦恼了,三天后,也让客户方查看了各自资源的分配情况,线程开启数量,内存使用情况等各种内存占用计算分析,两天都在加班在本子上鬼画符似的计算各自内存分配。
最终给出了三个解决方案。增加系统线程数thread_max ,被客户方否决原因说要重启系统风险更大,那就降低线程栈的大小吧,客户方回应默认就行,修改这个数值风险太大。
深受打击,最后我只好说,既然两项不行,那就把-XMX从1200M,改为1024m吧,反正你们最多也是只能用到900M,好吧这种解决方案风险最低。修改最方便。被采纳了,改为1001M,修改后重启了。其实在跟客户方提供解决方案沟通期间,还很费劲的解释了,JAVA NEW一个线程引发的后期血案等等,说明了线程创建后什么时候会占用系统内存、对内存,是谁占用怎么占用等等一大堆原理,才被采纳。其实我也是半吊子不是很懂,但是都是围绕了此问题,进行解释,才说服他们。就这样过了三周了,到现在貌似没出现任务错误,也看了,客户方前台操作响应很快,应该没问题了。希望不要在出问题了,记得今年四月份上线,出了问题,也是搞得我头昏脑胀的,那时不是数据库表分区,就是建索引要么改SQL实现方式,要么要修改应用代码设计,还要改各自参数配置,整个项目的人员一起忙得不亦乐乎,最终问题是解决,但是竟然还没顶住8个月又出问题了,这次我算是迷糊中解决了,但是下次在出现,不知道会是什么情况,只能拭目以待了,应该说下次出现了,不关我事了,这个项目交接给我之前的老东家了。
OutOfMemoryError本地线程不足问题分析的更多相关文章
- Java调优之jvm和线程的内存分析
本文来源于铁木箱子的博客http://www.mzone.cc 这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立 ...
- 【Java线程与内存分析工具】VisualVM与MAT简明教程
目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...
- JVM 内存溢出详解(栈溢出,堆溢出,持久代溢出、无法创建本地线程)
出处: http://www.jianshu.com/p/cd705f88cf2a 1.内存溢出和内存泄漏的区别 内存溢出 (Out Of Memory):是指程序在申请内存时,没有足够的内存空间供 ...
- Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- 本地线程-ThreadLocal
线程本地存储是一个自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储.简单来说,就是对于某个变量,针对不同的线程存储不同的值. 实例: import java.util.Random; i ...
- Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- Filter(过滤器)、ThreadLocal(本地线程)、Listener(监听器)
Filter(过滤器) Filter过滤器它的作用是:拦截请求,过滤响应. 过滤器链 1)执行的顺序依次是: A B C Demo03 C2 B2 A2 2)如果采取的是注解的方式进行配置,那么过滤器 ...
- JAVA线程池的分析和使用
1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提 ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- zepto源码分析·event模块
准备知识 事件的本质就是发布/订阅模式,dom事件也不例外:先简单说明下发布/订阅模式,dom事件api和兼容性 发布/订阅模式 所谓发布/订阅模式,用一个形象的比喻就是买房的人订阅楼房消息,售楼处发 ...
- Mybatis和Mysql的Datetime的一些问题
Mysql的时间类型 时间类型有time, date, datetime, timestamp 如Mysql官方文档所述: time 没有date,date没有time,datetime是date和t ...
- Redux的核心概念,实现代码与应用示例
Redux是一种JavaScript的状态管理容器,是一个独立的状态管理库,可配合其它框架使用,比如React.引入Redux主要为了使JavaScript中数据管理的方便,易追踪,避免在大型的Jav ...
- 汇编窥探Swift String的底层
String(字符串),是所有编程语言中非常重要的成员,因此非常值得去深入研究.众所周知,字符串的本质是字符序列,由若干个字符组成.比如字符串 "iOS" 由 'i'.'O'.'S ...
- Golang 实现华为云 DMS 签名
构造请求 首先构造请求,也就是要对哪个具体接口进行访问,需要提供什么必要的参数.在构造请求(点击查看中可以看到,对 DMS 服务来说必要的请求构成包括以下部分 请求URI,例如 https://dms ...
- Spring Boot 如何给微信公众号返回消息
hello 各位小伙伴,今天我们来继续学习如何通过 Spring Boot 开发微信公众号.还没阅读过上篇文章的小伙伴建议先看看上文,有助于理解本文: Spring Boot 开发微信公众号后台 上篇 ...
- 1、Hibernate-入门
一.概述 1.什么是Hibernate: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ...
- Vue+element UI实现分页组件
介绍 这是一个是基于element-UI的分页组件基础上,进行了二次封装的分页组件,在展示数据时,该分页组件采用了每显示一页数据,只请求当前页面的数据的请求策略,从而避免了一次性将数据全部请求所造成的 ...
- echarts动态刷新数据
在这次的项目中图表显示的部分比较多,这边给分享下用到的图表的数据刷新 饼图最后的效果 先看下 前端部分 <div div style="height: 40%; width: 17.5 ...
- 用Java实现简单的区块链
用 Java 实现简单的区块链 1. 概述 本文中,我们将学习区块链技术的基本概念.也将根据概念使用 Java 来实现一个基本的应用程序. 进一步,我们将讨论一些先进的概念以及该技术的实际应用. 2. ...