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 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- 自己动手破解Z.EntityFramework.Extensions 4.0.11.0的方法
因为项目中使用到Z.EntityFramework.Extensions 和 Z.EntityFramework.Plus(免费开源)两个类库,但是Z.EntityFramework.Extensio ...
- Enum枚举学习- java5之前和之后的写法
enum枚举 JDK1.5以前枚举的写法 /** * java5.0以前,定义枚举类.类中的对象是有限的 * @author amber * */ public class Season { priv ...
- MySQL基础篇(2)数据类型
MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时间类型. 1.数值类型 整数类型:TINYINT(1字节).SMALLINT(2字节).MEDIUMINT(3字节).INT(INTE ...
- 微服务SpringCloud之服务网关zuul二
Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...
- 常用html转义符,JavaScript转义符
HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,> ...
- Linux下搭建.NetCore3.0环境及创建项目
================================================== ================================================= ...
- makefile中":="和“=”的区别
在makefile中,经常能看到这种赋值方式: MyNumber := 这种方式洋名叫做expansion assignment, 翻译过来叫扩展赋值, 我一般就叫冒号等号.这位同学就问了,那么它和普 ...
- python之带有参数的装饰器
一个小demo def set_level(level_num): def set_func(func): def call_func(*args, **kwargs): if level_num = ...
- 关于发送邮件,错误“命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !”问题
最近做了一个小程序,通过QQ邮箱服务器发送邮件, 代码写完后,运行调试,出现“命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first !”的问题, 上网查询发现 ...
- python购物车练习题
# 购物车练习# 1.启动程序后,让用户输入工资,打印商品列表# 2.允许用户根据商品编号购买商品# 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒# 4.可随时退出,退出时,打印已购买 ...