1.1 编写目的

为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照。

1.2编写背景

最近服务器发现tomcat的应用会偶尔出现无法访问的情况。经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况。简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发现日志停止没有任何最新的访问日志。连tomcat下面的catalina.log也没有任何访问记录,基本断定该台tomcat已不能提供服务。

2 分析步骤

根据前面我描述的假死现象,我最先想到的是网络是否出现了问题,是不是有什么丢包严重的情况,于是我开始从请求的数据流程开始分析,由于我们业务的架构采用的是nginx+tomcat的集群配置,一个请求上来的流向可以用下图来简单的描述一下:

2.1检查nginx的网络情况

更改nginx的配置,让该台nginx请求只转到本机器的出现问题的tomcat应用上面,在access.log里看是否有网络请求,结果可以查看到当前所有的网络请求,也就是说可以排除是网络的问题。

2.2检查tomcat 的网络情况

分析业务配置的tomcat访问日志xxxx.log上是否有日志访问记录,经过查询该台tomcat应用日志完全没有任何访问记录,由于我们的部署是本机的nginx转到本机的tomcat应用,所以可以排除不是网络问题。到此基本可以断定网络没有问题,tomcat 本身出现了假死的情况。在tomcat的日志里有报过OutOfMemoryError的异常,所以可以肯定tomcat假死的原因是OOM

3 分析JVM内存溢出

3.1为什么会发生内存泄漏

在我们学习Java的时候就知道它最为方便的地方就是我们不需要管理内存的分配和释放,一切由JVM自己来进行处理,当Java对象不再被应用时,等到堆内存不够用时JVM会进行GC处理,清除这些对象占用的堆内存空间,但是如果对象一直被应用,那么JVM是无法对其进行GC处理的,那么我们创建新的对象时,JVM就没有办法从堆中获取足够的内存分配给此对象,这时就会导致OOM。我们出现OOM原因,一般都是因为我们不断的往容器里存放对象,然而容器没有相应的大小限制或清除机制,这样就容易导致OOM。

3.2快速定位问题

当我们的应用服务器占用了过多内存的时候,我们怎么样才能快速的定位问题呢?要想快速定位问题,首先我们必需获取服务器JVM某时刻的内存快照。Jdk里面提供了很多相应的命令比如:jstack,jstat,jmap,jps等等. 在出现问题后我们应该快速保留现场。

3.2.1 jstack

可以观察到jvm中当前所有线程的运行情况和线程当前状态.

sudo jstack -F 进程ID
输出内容如下:

从上面的图我们可以看到tomcat进程里面没有死锁的情况,而且每个线程都处理等待的状态。这个时候我们可以telnet命令连上tomcat的端口查看tomcat进程是否有任务回应。这时发现tomcat没有任何回应可以证明tomcat应用已没有响应处理假死状态。

3.2.2 jstat

这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
具体参数如下:
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
-printcompilation:不知道干什么的,一直没用过。

一般比较常用的几个参数是:
sudo jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)

查看当时的head情况

sudo jstat -gcutil  20683 2000

注:该图不是出错截取

出现时候截取的数据是gc已经完全没有处理了,因为没有加上full gc的日志所以不确定JVMGC 时间过长,导致应用暂停.

3.2.3获取内存快照

Jdk自带的jmap可以获取内在某一时刻的快照

命令:jmap -dump:format=b,file=heap.bin <pid>
file:保存路径及文件名
pid:进程编号(windows通过任务管理器查看,linux通过ps aux查看)
dump文件可以通过MemoryAnalyzer分析查看,网址:http://www.eclipse.org/mat/,可以查看dump时对象数量,内存占用,线程情况等。

从上面的图可以看得出来对象没有内存溢出。

从上图我们可以明确的看出此项目的HashMap内存使用率比较高,因为我们的系统都是返回Map的数据结构所以占用比较高的内存是正常情况。

3.2.4观察运行中的jvm物理内存的占用情况

观察运行中的jvm物理内存的占用情况。我们也可以用jmap命令
参数如下:
-heap
:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

命令使用:
jmap -heap 2083
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
输出内容:

上图为tomcat应用出错前JVM的配置信息,可以明确的看到当时的信息:

MaxHeapSize堆内存大小为:3500M

MaxNewSize新生代内存大小:512M

PermSize永久代内存大小:192M

NewRatio设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为2,则年轻代与年老代所占比值为1:2,年轻代占整个堆栈的1/3

SurvivorRatio设置年轻代中Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

在New Generation中,有一个叫Eden的空间,主要是用来存放新生的对象,还有两个SurvivorSpaces(from,to), 它们用来存放每次垃圾回收后存活下来的对象。在Old Generation中,主要存放应用程序中生命周期长的内存对象,还有个Permanent Generation,主要用来放JVM自己的反射对象,比如类对象和方法对象等。

从上面的图可以看出来JVM的新生代设置太小,可以看出应用的新生代区完全占满了,无法再往新生代区增加新的对象此时的这些对象都处于活跃状态,所以不会被GC处理,但是tomcat应用还在继续产生新的对象,这样就会导致OOM的发生,这就是导致tomcat假死的原因.

4 Tomcat假死其它情况

以下是网上资料说的tomcat假的情况:

1、应用本身程序的问题,造成死锁。

2、load 太高,已经超出服务的极限

3、jvm GC 时间过长,导致应用暂停

         因为出错项目里面没有打出GC的处理情况,所以不确定此原因是否也是我项目tomcat假死的原因之一。

4、大量tcp 连接 CLOSE_WAIT

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 48

CLOSE_WAIT 2228

ESTABLISHED 86

常用的三个状态是:ESTABLISHED 表示正在通信,T

tomcat 假死现象(转)相关推荐

  1. Tomcat假死的原因及解决方案

    假死:Linux服务器没有崩,浏览器访问页面,出现无法访问的情况但是并没有报4xx或5xx错误,重启tomcat后,恢复正常. 原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命 ...

  2. java移动文件导致tomcat死掉_原 netty导致tomcat假死

    一.系统需求: 保证后台系统在大并发下正常处理每一个业务连接请求. 二.运作方式: Netty+tomcat.在tomcat的web.xml配置文件中配置一个Listener类用来在tomcat初始化 ...

  3. cisco交换机端口“假死”现象

    "假死"现象蔓延 不得不根治? 但是最近几天单位那台连接数字电视前端系统的交换机上也出现了端口"假死"的现象,故障原因很快查清了:是因为该端口下面连接的一台交换 ...

  4. 教你几招解决电脑假死现象

    不少电脑使用者在平常的生活中,都遇到过电脑"假死"的现象,也就是长时间卡机不动,点击什么都没反应.这让我们很无奈,尤其是在工作中,文档写了一半,突然死机,运气好还能恢复,运气不好的 ...

  5. java程序假死_分析一个常见的java多线程通信问题(假死现象)

    一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了.对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的.在这篇 ...

  6. 【教程】完美解决windows10磁盘占用100%并出现卡顿、假死现象

    本文原始地址为:http://tieba.baidu.com/p/4359125660 欢迎浏览我的博客:https://fitz1318.top/ lz自从上win10以来经常会出现这种情况:磁盘突 ...

  7. Tomcat假死原因排查

    tomcat假死?为什么会假死呢,可能大多数人不会碰到这个问题,如果出现问题,重启服务器就好了,可是如果这个问题没有解决的话,那么就可能会存在相应的隐患,如果你的用户量多,那么必然你的请求量就高,这样 ...

  8. java win10窗口启动假死_window执行jar包会出现假死现象解决

    windows jar包启动的几种方式介绍 java -jar xxx.jar(jar包的路径),最普通简单的方式,通过windows的命令行窗口启动,并在命令行窗口运行,输出.可以在启动的时候增加参 ...

  9. ubuntu文件管理器打不开,出现假死现象的解决办法记录

    ubuntu文件管理器打不开,出现假死现象的解决办法记录 无论新建多少窗口,多少次双击一直出现这种文件管理器界面,一直进不去. 经了解, 一般是nautilus出错了,才出现假死现象,可以卸载之后重新 ...

最新文章

  1. android manifest 权限组,Android的单个或多个权限动态申请
  2. 拿到国际AI比赛冠军的,居然是个搞教育的
  3. dell笔记本耳机怎么设置_win10笔记本怎么设置合上盖子不休眠
  4. SCI论文写作--工科学生如何入门搞科研和写作
  5. Oracle学习:视图与索引
  6. InnoDB支持的最大事务数量
  7. MySQL计划任务3(转)
  8. 1.13编程基础之综合应用_14求满足条件的3位数
  9. (17)vivado2019.1不能生成bit文件解决方法(学无止境)
  10. (转)基于openlayers实现聚类统计展示
  11. 浅析 路印协议--Loopring 及整体分析 Relay 源码
  12. JavaScript基础知识学习
  13. java判断胡牌_怎么写一个c++程序判断麻将是否胡牌(只讨论清一色的情况)
  14. 关于微信小程序--授权弹窗
  15. 微信群助手(自动整理拼车信息)
  16. 程序运行产生SIGABRT信号的原因
  17. 阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧
  18. oppo R9sk 完美root 线刷包+救砖
  19. 51单片机密码锁(含确认键、清零键、删除键)
  20. 帝国CMS 7.2 WAP手机企业网站蓝色个性菜单整站模板

热门文章

  1. Vue3.0配置多页面应用
  2. vue单页面应用的优缺点
  3. centos7内核3.10.0-1160.el7.x86_64升级5.4.93-1.el7.elrepo.x86_64
  4. 一个关于Java程序安全意识重构的工具
  5. 浅谈电气火灾监控系统在煤矿高层公寓中的应用
  6. PT100/PT1000
  7. 黑莓9900能否读取二代身份证啊 求证中
  8. rtthread系统GDF450(BOOT+APP)
  9. 四川大学(新生赛)羊工八刀(为解决)
  10. clamav杀毒软件