`

cpu过高,并居高不下

 
阅读更多
1.查找应用的pid
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
分享到:
评论

相关推荐

    Foobar2000 CPU占用率居高不下.pdf

    【Foobar2000 CPU占用率居高不下】的问题可能是由于软件内部处理音频时的资源管理不当导致的。Foobar2000是一款高级的音频播放器,它支持多种音频格式和插件,但有时可能会因为开启过多的DSP模块或不恰当的输出设置...

    weblgicJVM内存不释放,CPU使用率居高不下建议.

    - **频繁的垃圾回收**:由于业务压力较大,JVM不得不频繁地执行垃圾回收任务,这会消耗大量的CPU资源,进而导致CPU使用率居高不下。 - **内存参数配置不当**:JVM的内存参数设置为`-Xms2048m -Xmx2048m`,即初始堆...

    CPU占用率居高不下的应对策略.pdf

    "CPU占用率居高不下的应对策略.pdf" 本文将详细介绍高CPU占用率的应对策略,包括系统进程svchost.exe、正常软件和explorer.exe进程的影响。 在Windows系统中,存在一个名为svchost.exe的系统进程,该进程是Windows...

    mysql CPU高负载问题排查

     在某个新服务器上,新建了一个MySQL的实例,该服务器上面只有MySQL这一个进程,但是CPU的负载却居高不下,使用top命令查询的结果如下: [dba_mysql@dba-mysql ~]$ top top - 17:12:44 up 104 days, 20 min, 2 ...

    win7CPU占用率居高不下_SVCHOST进程在作怪

    但是,有时候 SVCHOST 进程的 CPU 占用率可能会居高不下,这会对系统性能产生严重影响。 本文将指导用户如何解决 SVCHOST 进程高 CPU 占用率的问题,并提供了一些有用的技巧来排查和解决此类问题。 SVCHOST 进程是...

    sql语句导致oninit进程占用CPU过高问题定位方法

    在 Informix 服务器上,发现一个 Oninit 进程占用 CPU 居高不下,导致服务器性能下降。为了解决这个问题,我们需要找到引起该问题的根源,即哪个 SQL 语句执行引起的。 问题分析 通过 top 信息可以发现 Oninit ...

    glide加载gif 降低cpu

    5. **优化性能**:在`GIFDrawable`的`draw`方法中,我们可以利用`Movie`的`advance`方法来控制动画的播放,并根据需要进行绘制,从而避免不必要的帧解码,进一步节省CPU资源。 6. **注意兼容性**:虽然Android 7.0...

    cpu占用过高导致电脑很卡或无响应怎么办.docx

    硬件方面,老旧的电脑可能由于硬件配置落后,尤其是使用了过时的单核赛扬处理器等,无法满足现代多任务的需求,从而造成CPU使用率居高不下。硬件限制是导致CPU占用过高的一种无法通过软件优化彻底解决的根本问题。 ...

    cpu_stress(cpu压力测试)

    1. 高CPU使用率:如果测试过程中CPU使用率一直居高不下,可能表明系统在处理高负载时有瓶颈,需要检查硬件配置或优化软件。 2. 系统响应延迟:如果在压力下系统响应变慢,可能是内存不足或磁盘I/O问题,需要增加内存...

    一个正则表达式导致CPU 利用率居高不下

    正则表达式在编程中广泛用于文本匹配和处理,但如果不小心编写了复杂的或有回溯问题的正则表达式,可能会导致CPU利用率急剧上升,甚至达到100%,严重影响系统性能。这个问题通常出现在使用非确定性有限自动机(NFA)...

    Wince下CPU占用率,任务管理器

    3. **升级硬件**:在某些情况下,硬件性能限制可能导致CPU占用率居高不下,此时考虑升级CPU或增加内存可能有帮助。 4. **使用性能分析工具**:除了内置的任务管理器,还可以利用专门的性能分析工具进行更详细的诊断...

    CPU Meter Display

    2. **升级硬件**:如果CPU使用率经常居高不下,可能是CPU性能不足,考虑升级硬件,如增加内存或更换更强大的CPU。 3. **优化软件设置**:调整软件设置,减少资源占用,如降低游戏或应用的画质设置。 4. **定期维护**...

    解决CPU资源占用100%解决方案.pdf

    **原因分析**:大量蠕虫病毒在系统内部快速复制,导致CPU占用率居高不下。 - **解决方案**: - 使用可靠的杀毒软件进行全面扫描。 - 在DOS模式下进行彻底清理,防止病毒残留。 - 加强防毒意识,避免访问不安全...

    win10cpu占用高怎么办.docx

    在使用 Windows 10 操作系统时,用户可能会遇到 CPU 占用率居高不下的问题,这可能是由于多种原因引起的。以下是解决 Windows 10 CPU 占用高的问题的四种方法: 方法一:修改注册表 Windows 10 的 Cortana 功能...

    SNMP查看CPU信息

    如果 CPU 利用率一直居高不下,说明设备负载较重,需要对设备当前状况进行分析,找到引起设备负载过重的原因,从而预防和诊断网络故障。 Net-SNMP 是一种开源的 NMS 产品,它提供了一套完整的应用程序,实现了 ...

    IE7.0 cpu占用过大补丁

    在压缩包子文件的文件名称列表中,“微软出的解决IE7.0 CPU占用居高不下的补丁”可能是一个具体的补丁文件名,如KBnnnnn.exe,其中"nnnnn"代表补丁的特定编号。用户需要下载这个文件,然后按照微软提供的指南进行...

    Linux系统中CPU占用率较高问题排查思路与解决方法

    作为 Linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失。 很多运维的同学遇到这种状况往往会不知所措,...

    系统恢复后CPU过忙.pdf

    然而,在使用过程中,我们难免会遇到各种各样的技术问题,例如系统恢复或重启后CPU占用率居高不下,甚至达到100%,这种状况会在很大程度上影响计算机的响应速度和性能。特别是在使用Windows XP系统时,这种问题可能...

Global site tag (gtag.js) - Google Analytics