• jstack: Java占用高CPU分析之- GC task thread

    jstack 是JDK自带的堆栈跟踪工具,作用有两个:

    1. 为Java 进程或者核心文件打印出线程的堆栈信息;
    2. 远程调试服务器。

    查看用法:

    jstack -help
    Usage:
    jstack [-l] <pid>
    (to connect to running process)
    jstack -F [-m] [-l] <pid>
    (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
    (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
    (to connect to a remote debug server)

    Options:
    -F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m to print both java and native frames (mixed mode)
    -l long listing. Prints additional information about locks
    -h or -help to print this help message

    下面开始具体的调试步骤:

    1. top 命令可以看到具体的Java进程号:(注意这里的PID是进程ID)

    pid

    2. 然后按 Shift + h 直接列出线程号:注意这里的PID是线程ID(对应的是native 线程的id, 即nid)

    tid

    3. 可以看到主要是19226和19227这两个线程消耗大量的CPU,而且时间累占用了一个小时左右,需要把线程号转换成十六进制,因为打印出来的堆栈信息里面的线程号是十六进制形式: printf “%x/n” 19226

    printf

    4. 获得占用CPU的Java进程号和线程号后可以用jstack工具来打印堆栈信息了:

    (1) 先把整个进程堆栈信息打印预览: jstack 19214

    stack1

    stack2

    (2)如果要快速定位线程造成的问题用:jstack [PID(进程号)] | grep [PID(线程号十六进制)] -A 10

    stack3

     

    5. 从进程和线程的堆栈信息可以看出是JVM的GC线程一直在占用大量CPU, 定位代码得出的结论是:Java程序连MySQL频繁new connection而且没有调用close方法,导致GC线程一直占用CPU。

     

  • 博客之道——开启篇

    很早之前就开始写博客了,不过没有坚持下来,这次用上了WordPress,并且自己的域名还没有过期,会把写博客这项工作坚持下去。因为用文字和图片记录生活上的点点滴滴在自己看来是一种乐趣,所以在微博和微信上经常会刷同学们的屏。半年前用JSP+JavaBean+Servlet+MySQL写的那个博客也彻底弃用了,毕竟WordPress的用户体验很好。当初决定用Java写博客是因为JSP课程要做一个大实验,而自己觉得写一个博客挺有趣,因为可以在代码里面获得到很多有用的信息,例如访客的IP、从哪里转到这个博客、访问的时间、查询的字符串、浏览器类型和最感兴趣的模块等等,而这个JSP博客也实现了这些功能,只是把它部署到SAE上面,JVM的启动慢是一个问题,而且很多细节都没有处理好,所以就直接改用了WordPress。不过之前刚好有同学问到JSP+JavaBean+Servlet的设计流程是怎样的,就不想白白浪费了自己断断续续做了两个月的成果,把这个JSP博客放到了github上面(https://github.com/thatcat/jsp_blog/)。一些代码优化和数据库优化都没有做好优化,放上去只是让有需要的同学看看JSP+JavaBean+Servlet的设计流程是怎样的,不喜勿喷,哈哈。至于为什么不直接在CSDN或51CTO上面写博客,是因为比较喜欢直接操作数据库,特别是MySQL,而SAE提供了这方面的功能。