java应用挂死

现象:

  java开发的web应用无法访问

排查:

1.从resin/log/watchdog-manager.log的日志里可以看出来,jvm的内存满,无法创建新进程

java.lang.OutOfMemoryError: unable to create new native thread

at java.lang.Thread.start0(Native Method)

at java.lang.Thread.start(Thread.java:574)

at com.caucho.util.ThreadPool$ThreadLauncher.startConnection(ThreadPool.java:812)

at com.caucho.util.ThreadPool$ThreadLauncher.run(ThreadPool.java:851)

at java.lang.Thread.run(Thread.java:595)

2.用jstat –gcutil pid可以看出jvm的OLD堆内存区域已经100%,与上述判断符合

S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT

0.00   0.00  99.19 100.00  20.72    577   62.517   322 2953.102 3015.619

3.用jstack pid查看jvm的内部的执行线程情况,可以看到存在大量的下述线程,阻塞

Thread 15810: (state = BLOCKED)

- sun.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)

- java.util.concurrent.locks.LockSupport.park() @bci=5, line=118 (Interpreted frame)

- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=41, line=1767 (Interpreted frame)

- com.ctsi.nmp.flux.ecfchart.ECFluxChartService.writeChart(com.ctsi.nmp.flux.ecfchart.ECFluxChartType, com.ctsi.nmp.flux.ecfchart.E

CFluxType, java.lang.String, java.util.Date, java.util.Date, java.util.List, boolean, java.io.OutputStream) @bci=295, line=189 (Comp

iled frame)

- com.ctsi.nmp.flux.ecfchart.ECFluxChartClient.executeChart() @bci=1051, line=203 (Compiled frame)

- sun.reflect.GeneratedMethodAccessor49.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Compiled frame)

- sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame)

- com.ctsi.nmp.flux.ecfchart.ECFluxChartClient.execute() @bci=94, line=230 (Interpreted frame)

- _jsp._nos._flux._flux._chart._ECFluxChart__jsp._jspService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletR

esponse) @bci=130, line=39 (Compiled frame)

- com.caucho.jsp.JavaPage.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=9, line=61 (Interpreted frame)

- com.caucho.jsp.Page.pageservice(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=252, line=578

(Compiled frame)

- com.caucho.server.dispatch.PageFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=262, line=1

95 (Compiled frame)

- com.zhongying.util.EncodingFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain

) @bci=39, line=80 (Compiled frame)

- com.caucho.server.webapp.WebAppFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=140, line=1

87 (Compiled frame)

- com.caucho.server.dispatch.ServletInvocation.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=97, line=2

66 (Compiled frame)

- com.caucho.server.hmux.HmuxRequest.handleRequest() @bci=478, line=435 (Compiled frame)

- com.caucho.server.port.TcpConnection.run() @bci=375, line=678 (Compiled frame)

- com.caucho.util.ThreadPool$Item.runTasks() @bci=246, line=721 (Compiled frame)

- com.caucho.util.ThreadPool$Item.run() @bci=106, line=643 (Interpreted frame)

- java.lang.Thread.run() @bci=11, line=595 (Interpreted frame)

所以可以判断是应用的com.ctsi.nmp.flux.ecfchart.ECFluxChartClient.executeChart部分出现了问题,导致大量的线程阻塞,需要研发

排查优化这部分代码。

时间: 2024-07-28 14:22:29

java应用挂死的相关文章

java多线程小结,及解决应用挂死的问题

这两天为了定位JBOSS老是挂死的问题,学习了一下JAVA多线程方面的知识,在此总结一下 1.在Java程序中,JVM负责线程的调度.线程调度是指按照特定的机制为多个线程分配CPU的使用权. 调度的模式有两种:分时调度和抢占式调度.分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间:抢占式调度是根据线程的优先级别来获取CPU的使用权.JVM的线程调度模式采用了抢占式模式. 2.Thread类实际上也是实现了Runnable接口的类. 在启动的多线程的时候,需要先通过Thr

Linux服务器挂死案例分析

问题现象: 在linux服务器上运行一个指定的脚本时,就会出现无数个相同进程的,而且不停的产生,杀也杀不掉,最后系统就陷入死循环,无法登陆,只能人工去按机器的电源键才可以.这够崩溃的吧? 问题分析过程: 在分析过程中发现这个特定的脚本有些特别,和系统中已有的命令的名字是相同的. 以free命令为例: 这个脚本名字就叫做free(后面没有带.sh),而且这个脚本文件里又去调用了free命令. 这个脚本的本意应该是要去调用free命令来完成一个任务. 那是否就是因为这样就会导致问题呢? 其实光这样是

分析java进程假死状况

摘自: http://www.myexception.cn/internet/2044496.html 分析java进程假死情况 1 引言 1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发

关于用strace工具定位vrrpd进程有时会挂死的bug

只做工作总结备忘之用. 正在烧镜像,稍总结一下进来改bug遇到的问题. 一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现.交付在即,于是加调试信息,反复跑配置的脚本,定位bug. 一,期初怀疑是vtysh与vrrpd进程通信出现阻塞(现象即是系统挂死). (1)因为在跑配置脚本时,出现了enable命令也挂死的情况,所以这么怀疑: (2)在vrrpd与vtysh命令传输的关键点加打印信息(注意vrrpd不要-d daemon

Redis主从同步之主库挂死解决方案

Redis实现了主从同步,但是主库挂死了,如何处理 方案:切换主库的身份 # 连接从库 [[email protected] redis-4.0.12]# redis-cli -p 6380 # 取消从库身份 127.0.0.1:6380> slaveof no one # 连接从库 [[email protected] redis-4.0.12]# redis-cli -p 6381 # 重新设置从库 127.0.0.1:6381> slaveof 127.0.0.1 6380 切换完成!

Java对象之死

摘要: 我们都知道垃圾回收是指回收那些不再使用的对象所占的内存区域.生动的说,在 Java 的世界里,无用的人就要拉出去枪毙了,并且把其所占的地盘清理,以便让“别人“来使用. 如何判断对象“无用”? 关于判断对象是否无用的算法,在JVM的发展过程中出现过两种算法:一种是引用计数和根集算法. 引用计数算法... 我们都知道垃圾回收是指回收那些不再使用的对象所占的内存区域.生动的说,在 Java 的世界里,无用的人就要拉出去枪毙了,并且把其所占的地盘清理,以便让“别人“来使用. 如何判断对象“无用”

调用Runtime.getRuntime().exec()执行Linux脚本防挂死和返回脚本输出

1.在实际开发中,使用Runtime.getRuntime().exec()执行Linux脚本时,需要同时读取标准输出流与错误输出流缓冲区数据,因为操作系统缓冲区大小有限制,不及时处理会导致缓冲区占满而挂住,这种问题发生在于开发人员对该接口不了解而引发Bug. 具体可以通过使用两个线程同时去读错误和标准输出流缓冲区数据,然后用proc.waitFor()可以获取执行的结果.这种事最常见的场景,只关注脚本执行结果. 2.但在实际开发中,通过Runtime.getRuntime().exec()执行

openstack在vmware虚机环境(exsi或者workstation)中实例挂死

在vmware虚机环境中安装了openstack平台,创建实例cirros和centos,openstack并未报错,但是在novnc里查看cirros实例卡在grub无法进入系统,centos实例卡在install centos7之后的界面,并且报内核错误. 后来发现comtute节点的nova.conf中的virt_type=kvm,后改为virt_type=qemu后正常

java 输入挂

替换Scanner static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tokenizer = new StringTokenizer(""); static String nextLine() throws IOException {// 读取下一行字符串 return reader.readLine(); } stati