`
hanzhdy
  • 浏览: 28570 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

综合使用jdk工具查看线程情况

 
阅读更多
最近在测试环境做压测时,当压测运行一段时间后,发现应用无法处理任何相应。最后经过排查发现是因为logback的RollingFileAppender在并发情况下,会造成线程死锁等待(jstack中查看到大量waitting状态的线程)

解决方案,更改logback的appender

<appender name="RollingFile-Appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/rollingfile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_ARCHIVE}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>90</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 最大64MB 超过最大值,会重新建一个文件-->
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>
                [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
            </pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集,防止中文乱码 -->
        </encoder>
    </appender>
    <appender name="Async-Appender" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="RollingFile-Appender" />
    </appender>


    <root level="WARN">
        <appender-ref ref="Async-Appender" />
    </root>


附Java线程状态排查方案,下面的一些命令可能有些特殊,并不适用于本次出现的问题(本次出现的问题排查命令比较简单):

使用jps命令查看进程ID号

root@ubuntu:~/apps$ jps -mlvV | grep -v 'mlvV'
1401 gateway-0.0.1-SNAPSHOT.jar
1374 eureka-server-0.0.1-SNAPSHOT.jar


使用top命令查看内存与CPU情况(可以直接top查看整体情况,这里面使用top -Hp ${pid}查看的是单个java进程中所有的线程)
root@ubuntu:~/apps$ top -Hp 1401
top - 19:17:23 up 2 days, 13:56,  1 user,  load average: 0.03, 0.03, 0.00
Threads:  71 total,   0 running,  71 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4028724 total,  1166204 free,  2214336 used,   648184 buff/cache
KiB Swap:  4192252 total,  4192252 free,        0 used.  1555352 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  1457 root      20   0 3584736 657100  17876 S  1.0 16.3  19:39.91 java
  1435 root      20   0 3584736 657100  17876 S  0.7 16.3  19:32.40 java
  1439 root      20   0 3584736 657100  17876 S  0.3 16.3   0:14.52 java
  1374 root      20   0 3584736 657100  17876 S  0.0 16.3   0:00.00 java
  1376 root      20   0 3584736 657100  17876 S  0.0 16.3   0:09.49 java


如发现有某个进程使用的内存或CPU超出预期,可单独查看该进程的虚拟机栈
因为jstack中,线程ID是16进制,而top命令看到的线程ID是10进制,可以使用如下命令,将10进制转化为16进制:

root@ubuntu:~/apps$ printf '%x\n' 1457
5b1


使用jstack,观察线程的虚拟机栈与运行情况。这里面采用grep -n '0x5b1',可以查看到指定线程号,在jstack输出中的行号(位置),然后再采用more +n${num}命令可以从指定的行开始查看内容

也可以直接使用jstack 1374,查看栈的整体情况

root@ubuntu:~/apps$ jstack 1374|grep -n '0x5b1'
321:"TaskAcceptor-localhost" #51 daemon prio=5 os_prio=0 tid=0x00007fae7d7f6800 nid=0x5b1 waiting on condition [0x00007fae2da86000]


从指定的行开始查看线程的虚拟机栈与运行状态(关键是more +n)
root@ubuntu:~/apps$ jstack 1374|more +n321
"TaskAcceptor-localhost" #51 daemon prio=5 os_prio=0 tid=0x00007fae7d7f6800 nid=0x5b1 waiting on condition [0x00007fae2da86000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000c537a0a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
	at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
	at com.netflix.eureka.util.batcher.AcceptorExecutor$AcceptorRunner.drainInputQueues(AcceptorExecutor.java:225)
	at com.netflix.eureka.util.batcher.AcceptorExecutor$AcceptorRunner.run(AcceptorExecutor.java:186)
	at java.lang.Thread.run(Thread.java:748)
分享到:
评论

相关推荐

    java jdk帮助工具

    13. **jvisualvm综合监测工具**:集成了许多JDK自带的监测工具,提供更友好的图形界面,可以进行性能分析、内存检测、线程检查等。 这些工具是Java开发者的日常利器,通过深入理解和熟练运用,能够提高开发效率,...

    JDK自带调试工具doc

    以上工具的使用通常需要与相应的帮助文档配合,如`java.chm`可能包含了JDK的综合帮助文档,而`jstat - Java Virtual Machine Statistics Monitoring Tool.htm`、`jps - Java Virtual Machine Process Status Tool....

    JDK使用参考书.rar

    1. **JDK工具的使用**:如javac编译器、jar打包工具、javadoc文档生成器、jconsole性能监控工具等。 2. **JVM参数调整**:如何优化JVM内存设置、垃圾收集策略等,以提升程序性能。 3. **调试技巧**:使用jdwp进行...

    JDK 性能

    例如,JConsole和VisualVM是两个常用的JVM监视工具,可以实时查看CPU使用率、内存状况、线程状态等,帮助我们定位性能问题。JProfiler则是一个强大的商业Java性能分析器,能够进行深度内存分析和CPU性能剖析。此外,...

    jdk6免安装包

    新的MBeanServerBuilder允许自定义MBean服务器的实现,而JConsole工具则提供了一个图形化的监控界面,用于查看和管理Java应用的资源使用情况。 对于开发者来说,JDK6的Javadoc工具和源代码分析工具有所改进,能够...

    JDK1.6版本java

    JDK1.6还包含了一些开发者工具,如JConsole用于监控和管理Java应用的性能,JVisualVM提供了一个综合性的诊断工具,包括内存分析、线程调试、CPU性能剖析等功能。这些工具对于理解和优化Java应用的性能至关重要。 总...

    java的jdk6安装包

    Java JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件工具包,而JDK6是Java的一个重要版本,发布于2006年。本篇将详细介绍Java JDK6的安装过程及其相关知识点。 一、Java JDK6概述...

    jdk-8u201-linux-x64.tar.gz.zip

    6. **开发者工具**:如JConsole(用于监控JVM的性能)、JVisualVM(综合的性能分析工具)、jmap、jhat等,帮助开发者调试和优化程序。 **JDK 8u201的更新与改进:** JDK 8u201是一个维护更新版本,主要修复了安全...

    JDK_API_1.6_中文版本CHM

    《JDK_API_1.6_中文版本CHM》是一个针对Java开发人员极其重要的参考资料,它包含了Java Development Kit(JDK)1.6版本的官方API文档,且以中文的形式呈现,便于中国开发者理解和使用。这个CHM文件是离线版的API文档...

    jdk1.8中文版.7z

    JDK是Oracle公司提供的Java编程语言的开发和运行环境,包含了编译器、JVM(Java虚拟机)、调试工具和其他必要的工具。这个版本特别指出是1.8,这意味着它对应的是Java 8,这是一个里程碑式的版本,引入了许多重要的...

    JDK_API_1.6中文版

    JDK (Java Development Kit) 是Oracle公司发布的用于开发和运行Java应用程序的工具集。JDK 1.6是Java平台的一个重要版本,包含了Java SE(标准版)的核心组件。这个版本的API中文版为开发者提供了详细的中文文档,...

    JDK 8 + Spring Boot 2.7.18

    5. **新并发工具**:如`ForkJoinPool`和`CompletableFuture`,增强了多线程编程的能力。 【Spring Boot 2.7.18】是Spring框架的一个子项目,致力于简化Spring应用的初始搭建以及开发过程。其特点包括: 1. **自动...

    Hadoop配套资源,hadoop3.2 jdk1.8

    标签中的“综合资源”意味着这个压缩包可能包含除了Hadoop和JDK之外的其他辅助工具或配置文件,如Hadoop的配置示例、依赖库或脚本,这些都可能是部署和运行Hadoop集群所需的基本元素。 “大数据”和“big data”...

    API包含JDK1.6和SSH框架的api

    这个版本的JDK包含了Java核心类库,如集合框架、I/O流、多线程、网络编程以及反射等重要功能。学习JDK1.6的API可以帮助开发者理解Java基础语法和类库的使用,例如`java.util`包下的ArrayList、HashMap,或者`java.io...

    Java JDK 实例宝典

    Java JDK实例宝典是一份深度探索Java开发工具包(Java Development Kit)的综合资源,它为Java程序员提供了大量实例,帮助他们深入理解JDK的各种功能和用法。这份宝典涵盖了从基础到高级的Java编程概念,是学习和...

    jdk-api-1.8.CHM Java帮助手册中文版

    Java JDK API 1.8是Java开发工具包(Java Development Kit)的一个重要组成部分,它包含了大量的类库、接口和工具,是Java程序员进行开发时不可或缺的参考文档。CHM(Compiled HTML Help)格式的文档使得这份帮助...

    Java多线程程序死锁检查 JCarder

    Java多线程编程是开发高并发应用的关键技术之一,但随之而来的是各种复杂的问题,其中最令人头疼的...通过使用JCarder这样的工具,我们可以更加高效地调试和优化多线程程序,确保其在高并发环境下的正确性和稳定性。

    《java JDK 实例开发宝典》源码

    《Java JDK实例开发宝典》源码是一份涵盖了Java编程语言和JDK(Java Development Kit)广泛使用领域的宝贵资源。这份源码集合旨在为开发者提供深入理解Java API、类库和核心概念的实际示例,帮助他们在实践中提升...

    JavaJVM线程调优.pdf

    Java JVM 线程调优是提升程序性能的关键环节,主要涉及到线程栈大小的调整、偏向锁的使用以及自旋锁的优化等方面。本文将深入解析这些知识点,并提供相关建议。 1. **线程栈大小调整**: 线程栈用于存储方法调用的...

    【JAVA WEB实用技巧与优化方案】如何排查JVM线程和内存相关问题

    2. **堆内存分析**:分析堆内存使用情况,查找内存溢出的迹象,比如大对象、内存碎片等。如果看到"十亿分之一"的对象或者内存使用量持续增长,可能存在内存泄漏。 3. **垃圾收集器行为**:观察垃圾收集器的工作模式...

Global site tag (gtag.js) - Google Analytics