- 浏览: 51522 次
- 性别:
- 来自: 成都
文章分类
1.查找应用的pid
2.查找pid对应下的线程的哪些id过高
3.jstack pid连续两次获取堆栈的信息,查看变化,以及对应的线程
4.根据堆栈的信息,cpu过高在的线程id,定位到相应的调用
5.根据定位到的信息可以猜测到应该是正则死循环
6.然后查看代码
7.没有循环调用,然后百度google java 正则 死循环 cpu过高
8.sun官网已经有提交的bug,然后得到线上java版本 比较是否是同样问题,根据描述看能否复现
9.发现字符串长度到30左右确实可以复现,接着换成以前检验邮箱的正则,用同样的代码看是否有问题,发现没有问题了,说明是正则的问题
10.仔细检查正则,可以用asm修改Pattern的字节码,增加打印信息,调试,发现假死
打印信息:
2.查找pid对应下的线程的哪些id过高
3.jstack pid连续两次获取堆栈的信息,查看变化,以及对应的线程
Thread 5812: (state = BLOCKED) - java.lang.Object.wait(long) @bci=0 (Interpreted frame) - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame) - org.apache.tomcat.util.net.JIoEndpoint$Worker.await() @bci=8, line=458 (Interpreted frame) - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=11, line=484 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame) Thread 31207: (state = IN_JAVA) java.lang.CharSequence) @bci=54, line=3744 (Compiled frame) - java.util.regex.Pattern$GroupHead.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=28, line=4168 (Compiled frame) - java.util.regex.Pattern$Loop.matchInit(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=39, line=4311 (Interpreted frame) - java.util.regex.Pattern$Prolog.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=7, line=4251 (Interpreted frame) - java.util.regex.Pattern$Begin.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=30, line=3120 (Interpreted frame) - java.util.regex.Matcher.match(int, int) @bci=86, line=1127 (Compiled frame) - java.util.regex.Matcher.matches() @bci=6, line=502 (Interpreted frame) - com.jd.edmfont.action.MailSubscriptionAction.checkAndGetMailAddress() @bci=155, line=236 (Interpreted frame) - com.jd.edmfont.action.MailSubscriptionAction.mailOrder() @bci=45, line=132 (Interpreted frame) - sun.reflect.GeneratedMethodAccessor229.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame) - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=161, line=597 (Compiled frame) - com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(java.lang.Object, com.opensymphony.xwork2.config.entities.ActionConfig) @bci=228, line=450 (Interpreted frame) - com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly() @bci=14, line=289 (Compiled frame) com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(com.opensymphony.xwork2.ActionInvocation) @bci=6, line=265 (Interpreted frame) - org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(com.opensymphony.xwork2.ActionInvocation) @bci=202, line=68 (Interpreted frame) - com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(com.opensymphony.xwork2.ActionInvocation) @bci=10, line=98 (Interpreted frame) - com.opensymphony.xwork2.DefaultActionInvocation.invoke() @bci=82, line=246 (Compiled frame) org.apache.struts2.dispatcher.Dispatcher.serviceAction(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.ServletContext, org.apache.struts2.dispatcher.mapper.ActionMapping) @bci=212, line=546 (Interpreted frame) - org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.apache.struts2.dispatcher.mapper.ActionMapping) @bci=11, line=77 (Interpreted frame) - org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=149, line=91 (Interpreted frame) - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=119, line=235 (Interpreted frame) - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=206 (Interpreted frame) - com.jd.common.web.filter.CharsetFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=166, line=59 (Interpreted frame) - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=119, line=235 (Interpreted frame) org.apache.catalina.connector.CoyoteAdapter.service(org.apache.coyote.Request, org.apache.coyote.Response) @bci=158, line=291 (Interpreted frame) - org.apache.coyote.http11.Http11Processor.process(java.net.Socket) @bci=514, line=859 (Interpreted frame) - org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(java.net.Socket) @bci=82, line=602 (Interpreted frame) - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=41, line=489 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame) Thread 31203: (state = IN_JAVA) - java.lang.Character.codePointAt(java.lang.CharSequence, int) @bci=5, line=2335 (Compiled frame; information may be imprecise) - java.util.regex.Pattern$CharProperty.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=10, line=3344 (Compiled frame) - java.util.regex.Pattern$Loop.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=139, line=4304 (Compiled frame) - java.util.regex.Pattern$GroupTail.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=70, line=4227 (Compiled frame) - java.util.regex.Pattern$GroupHead.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=28, line=4168 (Compiled frame) - java.util.regex.Pattern$Loop.matchInit(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=39, line=4311 (Interpreted frame) - java.util.regex.Pattern$Prolog.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=7, line=4251 (Interpreted frame) - java.util.regex.Pattern$Begin.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=30, line=3120 (Interpreted frame) - java.util.regex.Matcher.match(int, int) @bci=86, line=1127 (Compiled frame) - java.util.regex.Matcher.matches() @bci=6, line=502 (Interpreted frame) - com.jd.edmfont.action.MailSubscriptionAction.checkAndGetMailAddress() @bci=155, line=236 (Interpreted frame) - com.jd.edmfont.action.MailSubscriptionAction.mailOrder() @bci=45, line=132 (Interpreted frame) - sun.reflect.GeneratedMethodAccessor229.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame) - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=161, line=597 (Compiled frame) - com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(java.lang.Object, com.opensymphony.xwork2.config.entities.ActionConfig) @bci=228, line=450 (Interpreted frame) - com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly() @bci=14, line=289 (Compiled frame) - com.opensymphony.xwork2.DefaultActionInvocation.invoke() @bci=111, line=252 (Compiled frame) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(com.opensymphony.xwork2.ActionInvocation) @bci=525, line=191 (Interpreted frame) - com.opensymphony.xwork2.DefaultActionInvocation.invoke() @bci=82, line=246 (Compiled frame) - org.apache.struts2.interceptor.MultiselectInterceptor.intercept(com.opensymphony.xwork2.ActionInvocation) @bci=121, line=73 (Interpreted frame) - com.opensymphony.xwork2.DefaultActionInvocation.invoke() @bci=82, line=246 (Compiled frame) com.jd.edmfont.action.EdmBaseInterceptor.intercept(com.opensymphony.xwork2.ActionInvocation) @bci=66, line=47 (Interpreted frame) - com.opensymphony.xwork2.DefaultActionInvocation.invoke() @bci=82, line=246 (Compiled frame) - org.apache.struts2.impl.StrutsActionProxy.execute() @bci=20, line=54 (Interpreted frame) - org.apache.struts2.dispatcher.Dispatcher.serviceAction(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.ServletContext, org.apache.struts2.dispatcher.mapper.ActionMapping) @bci=212, line=546 (Interpreted frame) - org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.apache.struts2.dispatcher.mapper.ActionMapping) @bci=11, line=77 (Interpreted frame) org.apache.catalina.connector.CoyoteAdapter.service(org.apache.coyote.Request, org.apache.coyote.Response) @bci=158, line=291 (Interpreted frame) - org.apache.coyote.http11.Http11Processor.process(java.net.Socket) @bci=514, line=859 (Interpreted frame) - org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(java.net.Socket) @bci=82, line=602 (Interpreted frame) - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=41, line=489 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame) Thread 31195: (state = BLOCKED) - java.lang.Object.wait(long) @bci=0 (Interpreted frame) - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame) - org.apache.tomcat.util.net.JIoEndpoint$Worker.await() @bci=8, line=458 (Interpreted frame) - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=11, line=484 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame)
4.根据堆栈的信息,cpu过高在的线程id,定位到相应的调用
- java.util.regex.Pattern$GroupHead.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=28, line=4168 (Compiled frame; information may be imprecise) - java.util.regex.Pattern$Loop.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=106, line=4295 (Compiled frame) - java.util.regex.Pattern$GroupTail.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=70, line=4227 (Compiled frame) - java.util.regex.Pattern$Ques.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=68, line=3691 (Compiled frame) - java.util.regex.Pattern$Ques.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=68, line=3691 (Compiled frame) - java.util.regex.Pattern$Curly.match0(java.util.regex.Matcher, int, int, java.lang.CharSequence) @bci=141, line=3782 (Compiled frame) - java.util.regex.Pattern$Curly.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=54, line=3744 (Compiled frame) - java.util.regex.Pattern$GroupHead.match(java.util.regex.Matcher, int, java.lang.CharSequence) @bci=28, line=4168 (Compiled frame)
5.根据定位到的信息可以猜测到应该是正则死循环
6.然后查看代码
String checkemail = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; Pattern regexemail = Pattern.compile(checkemail); if (mailAddress != null) { if (!regexemail.matcher(mailAddress).matches()) { mailAddress = null; } }
7.没有循环调用,然后百度google java 正则 死循环 cpu过高
8.sun官网已经有提交的bug,然后得到线上java版本 比较是否是同样问题,根据描述看能否复现
9.发现字符串长度到30左右确实可以复现,接着换成以前检验邮箱的正则,用同样的代码看是否有问题,发现没有问题了,说明是正则的问题
10.仔细检查正则,可以用asm修改Pattern的字节码,增加打印信息,调试,发现假死
public class MethodCallCountTransformer implements ClassFileTransformer { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { try { if (!"java/util/regex/Pattern$CharProperty".equals(className) && !"java/util/regex/Pattern$BmpCharProperty".equals(className)) { return classfileBuffer; } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassAdapter adapter = new MethodCallClassAdapter(writer, className,"match"); ClassReader reader = new ClassReader(classfileBuffer); reader.accept(adapter, 0); // 生成新类字节码 return writer.toByteArray(); } catch (Exception e) { e.printStackTrace(); // 返回旧类字节码 return classfileBuffer; } } public static void premain(String options, Instrumentation ins) { //注册我自己的字节码转换器 ins.addTransformer(new MethodCallCountTransformer()); } }
public MethodCallClassAdapter(ClassVisitor classVisitor,String className,String methodName) { super(classVisitor); this.className=className; this.methodName=methodName; } // 重写 visitMethod,访问到 "operation" 方法时, // 给出自定义 MethodVisitor,实际改写方法内容 public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) { MethodVisitor mv = cv.visitMethod(access, name, desc, signature,exceptions); MethodVisitor wrappedMv = mv; if (mv != null) { // 对于 "operation" 方法 if (name.equals(methodName)) { // 使用自定义 MethodVisitor,实际改写方法内容 wrappedMv = new CountCallMethodAdapter(mv,className,methodName); } // else if (name.equals("<init>")) { // wrappedMv = new ChangeToChildConstructorMethodAdapter(mv, // className); // } } return wrappedMv; }
@Override public void visitCode() { visitLdcInsn(className); visitLdcInsn(methodName); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/jd/tuhao/agent/Counter", "printAndIncCount", "(Ljava/lang/String;Ljava/lang/String;)V"); super.visitCode(); }
public class Counter { private static AtomicInteger methodCallCount = new AtomicInteger(0); public static void printAndIncCount(String className, String methodName) { System.out.println(className + "." + methodName + " called, total times " + methodCallCount.incrementAndGet()); } }
打印信息:
java/util/regex/Pattern$BmpCharProperty.match called, total times 424 java/util/regex/Pattern$CharProperty.match called, total times 425 java/util/regex/Pattern$CharProperty.match called, total times 426 java/util/regex/Pattern$CharProperty.match called, total times 427 java/util/regex/Pattern$CharProperty.match called, total times 428 java/util/regex/Pattern$CharProperty.match called, total times 429 java/util/regex/Pattern$CharProperty.match called, total times 430 java/util/regex/Pattern$CharProperty.match called, total times 431 java/util/regex/Pattern$CharProperty.match called, total times 432 java/util/regex/Pattern$CharProperty.match called, total times 433 java/util/regex/Pattern$CharProperty.match called, total times 434 java/util/regex/Pattern$BmpCharProperty.match called, total times 435 java/util/regex/Pattern$CharProperty.match called, total times 436 java/util/regex/Pattern$BmpCharProperty.match called, total times 437 java/util/regex/Pattern$CharProperty.match called, total times 438 java/util/regex/Pattern$BmpCharProperty.match called, total times 439 java/util/regex/Pattern$CharProperty.match called, total times 440
发表评论
-
cpu突然飙高,过阵下降
2016-11-03 16:04 10231.首先业务属于web内网业务 2.按照经验jstack 查 ... -
jstorm 安装
2016-11-03 15:53 18821.主要看阿里官网https://github.com/ali ... -
java.lang.OutOfMemoryError: unable to create new native thread
2015-08-05 18:58 7141.系统以及线上现象介绍: 以前运行正常,对比以前,任务 ... -
mat分析内存上涨的原因
2014-04-15 11:32 729MAT Eclipse Memory Analyze ... -
转:vm-sdk-java安装开发环境
2014-02-19 21:09 1543vSphere Web Services SDK 安装 分 ... -
sphinx安装测试
2013-03-04 15:54 780CoreSeek sphinx安装 主要参照http://ww ... -
ibatis自动生成代码,abator
2011-07-01 11:26 10331.首先新建工程,引入abator.jar包 2.建运行类 ... -
spring自动重载
2011-07-01 11:14 8421.运行类 public static void main(S ...
相关推荐
【Foobar2000 CPU占用率居高不下】的问题可能是由于软件内部处理音频时的资源管理不当导致的。Foobar2000是一款高级的音频播放器,它支持多种音频格式和插件,但有时可能会因为开启过多的DSP模块或不恰当的输出设置...
- **频繁的垃圾回收**:由于业务压力较大,JVM不得不频繁地执行垃圾回收任务,这会消耗大量的CPU资源,进而导致CPU使用率居高不下。 - **内存参数配置不当**:JVM的内存参数设置为`-Xms2048m -Xmx2048m`,即初始堆...
"CPU占用率居高不下的应对策略.pdf" 本文将详细介绍高CPU占用率的应对策略,包括系统进程svchost.exe、正常软件和explorer.exe进程的影响。 在Windows系统中,存在一个名为svchost.exe的系统进程,该进程是Windows...
在某个新服务器上,新建了一个MySQL的实例,该服务器上面只有MySQL这一个进程,但是CPU的负载却居高不下,使用top命令查询的结果如下: [dba_mysql@dba-mysql ~]$ top top - 17:12:44 up 104 days, 20 min, 2 ...
但是,有时候 SVCHOST 进程的 CPU 占用率可能会居高不下,这会对系统性能产生严重影响。 本文将指导用户如何解决 SVCHOST 进程高 CPU 占用率的问题,并提供了一些有用的技巧来排查和解决此类问题。 SVCHOST 进程是...
在 Informix 服务器上,发现一个 Oninit 进程占用 CPU 居高不下,导致服务器性能下降。为了解决这个问题,我们需要找到引起该问题的根源,即哪个 SQL 语句执行引起的。 问题分析 通过 top 信息可以发现 Oninit ...
5. **优化性能**:在`GIFDrawable`的`draw`方法中,我们可以利用`Movie`的`advance`方法来控制动画的播放,并根据需要进行绘制,从而避免不必要的帧解码,进一步节省CPU资源。 6. **注意兼容性**:虽然Android 7.0...
硬件方面,老旧的电脑可能由于硬件配置落后,尤其是使用了过时的单核赛扬处理器等,无法满足现代多任务的需求,从而造成CPU使用率居高不下。硬件限制是导致CPU占用过高的一种无法通过软件优化彻底解决的根本问题。 ...
1. 高CPU使用率:如果测试过程中CPU使用率一直居高不下,可能表明系统在处理高负载时有瓶颈,需要检查硬件配置或优化软件。 2. 系统响应延迟:如果在压力下系统响应变慢,可能是内存不足或磁盘I/O问题,需要增加内存...
正则表达式在编程中广泛用于文本匹配和处理,但如果不小心编写了复杂的或有回溯问题的正则表达式,可能会导致CPU利用率急剧上升,甚至达到100%,严重影响系统性能。这个问题通常出现在使用非确定性有限自动机(NFA)...
3. **升级硬件**:在某些情况下,硬件性能限制可能导致CPU占用率居高不下,此时考虑升级CPU或增加内存可能有帮助。 4. **使用性能分析工具**:除了内置的任务管理器,还可以利用专门的性能分析工具进行更详细的诊断...
2. **升级硬件**:如果CPU使用率经常居高不下,可能是CPU性能不足,考虑升级硬件,如增加内存或更换更强大的CPU。 3. **优化软件设置**:调整软件设置,减少资源占用,如降低游戏或应用的画质设置。 4. **定期维护**...
**原因分析**:大量蠕虫病毒在系统内部快速复制,导致CPU占用率居高不下。 - **解决方案**: - 使用可靠的杀毒软件进行全面扫描。 - 在DOS模式下进行彻底清理,防止病毒残留。 - 加强防毒意识,避免访问不安全...
在使用 Windows 10 操作系统时,用户可能会遇到 CPU 占用率居高不下的问题,这可能是由于多种原因引起的。以下是解决 Windows 10 CPU 占用高的问题的四种方法: 方法一:修改注册表 Windows 10 的 Cortana 功能...
如果 CPU 利用率一直居高不下,说明设备负载较重,需要对设备当前状况进行分析,找到引起设备负载过重的原因,从而预防和诊断网络故障。 Net-SNMP 是一种开源的 NMS 产品,它提供了一套完整的应用程序,实现了 ...
在压缩包子文件的文件名称列表中,“微软出的解决IE7.0 CPU占用居高不下的补丁”可能是一个具体的补丁文件名,如KBnnnnn.exe,其中"nnnnn"代表补丁的特定编号。用户需要下载这个文件,然后按照微软提供的指南进行...
作为 Linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失。 很多运维的同学遇到这种状况往往会不知所措,...
然而,在使用过程中,我们难免会遇到各种各样的技术问题,例如系统恢复或重启后CPU占用率居高不下,甚至达到100%,这种状况会在很大程度上影响计算机的响应速度和性能。特别是在使用Windows XP系统时,这种问题可能...