zoukankan      html  css  js  c++  java
  • JVM 问题排查常用工具

    一、 jmap

    // 打印jvm的堆状况,主要是年轻代和老年代信息
    jmap -heap <pid>
    如:
    Heap Configuration:
       MinHeapFreeRatio = 40
       MaxHeapFreeRatio = 70
       MaxHeapSize      = 536870912 (512.0MB)
       NewSize          = 1310720 (1.25MB)
       MaxNewSize       = 17592186044415 MB
       OldSize          = 5439488 (5.1875MB)
       NewRatio         = 2
       SurvivorRatio    = 8
       PermSize         = 21757952 (20.75MB)
       MaxPermSize      = 268435456 (256.0MB)
       G1HeapRegionSize = 0 (0.0MB)
    
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 46661632 (44.5MB)
       used     = 1139464 (1.0866775512695312MB)
       free     = 45522168 (43.41332244873047MB)
       2.441972025324789% used
    From Space:
       capacity = 524288 (0.5MB)
       used     = 0 (0.0MB)
       free     = 524288 (0.5MB)
       0.0% used
    To Space:
       capacity = 1048576 (1.0MB)
       used     = 0 (0.0MB)
       free     = 1048576 (1.0MB)
       0.0% used
    PS Old Generation
       capacity = 112721920 (107.5MB)
       used     = 54152304 (51.64366149902344MB)
       free     = 58569616 (55.85633850097656MB)
       48.04061534792878% used
    PS Perm Generation
       capacity = 94371840 (90.0MB)
       used     = 94050296 (89.69335174560547MB)
       free     = 321544 (0.30664825439453125MB)
       99.65927971733942% used
    
    37542 interned Strings occupying 3976528 bytes.

    以上的输出很简单,第四行起开始输出此进程的JAVA使用的环境
    Heap Configuration:指java应用启动时设置的JVM参数。像最大使用内存大小,年老代,年青代,持久代大小等。

    Heap Usage:当时的heap实际使用情况。包括新生代、老生代和持久代。

    其中新生代包括:Eden区的大小、已使用大小、空闲大小及使用率。Survive区的From和To同样。

    有这个可以很简单的查看本进程的内存使用情况。

    可以用于分析堆内存分区大小是否合理,新生代和老生代的大小分配是否合适等。

    也许进程占用的总内存比较多,但我们在这里可以看到真正用到的并没有多少,很多都是"Free"。内存使用的堆积大多在老年代,内存池露始于此,所以要格外关心“Old Generation”。

    查看整个JVM内存状态 
    jmap -heap [pid]
    要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起

    查看JVM堆中对象详细占用情况
    jmap -histo [pid]

    导出整个JVM 中内存信息
    jmap -dump:format=b,file=文件名 [pid]

    二、 jhat

    jhat是sun 1.6及以上版本中自带的一个用于分析JVM 堆DUMP 文件的工具,基于此工具可分析JVM HEAP 中对象的内存占用情况
    jhat -J-Xmx1024M [file]
    执行后等待console 中输入start HTTP server on port 7000 即可使用浏览器访问 IP:7000


    kill -3 [pid]
    在Linux 上找到Java所在的进程号,然后执行以上命令,线程的相关信息就输出到console

    三、 jstack

    jstack 是sun JDK 自带的工具,通过该工具可以看到JVM 中线程的运行状况,包括锁等待,线程是否在运行
    执行 jstack [pid] ,线程的所有堆栈信息

    "http-8080-10" daemon prio=10 tid=x0a949bb60 nid=0x884  waiting for monitor entry [...]

    "http-8080-10" 这个线程处于等待状态。 waiting for monitor entry 如果在连续几次输出线程堆栈信息都存在于同一个或多个线程上时,则说明系统中有锁竞争激烈,死锁,或锁饿死的想象。

    “http-8080-11” daemon prio=10 tix=xxx nid=xxx in object.wait() [...]
     java.lang.Thread.State:waiting (on object monitor)
    该表示http-8080-11的线程处于对象的Wait 上,等待其他线程的唤醒,这也是线程池的常见用法。

    “Low Memory Detector”daemon prio=10 tix=xx nid=xxx runnable [...] java.lang.Thread.State:runnable

    表示“Low Memory Detector” 的线程处于Runable状态,等待获取CPU的使用权.

    四、 Java VisualVM

    对于使用命令行远程监控jvm 太麻烦 。 在jdk1.6 中 Oracle 提供了一个新的可视化的。 JVM 监控工具 Java VisualVM 。jvisualvm.exe 在JDK 的 bin 目录下。 

    双击启动 Java VisualVM 后可以看到窗口左侧 “应用程序 ”栏中有“ 本地 ”、“远程 ” 、“快照 ”三个项目。

    “本地 ”下显示的是在 localhost 运行的 Java 程序的资源占用情况,如果本地有 Java 程序在运行的话启动 Java VisualVM 即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的 统计信息。

    “远程” 项下列出的远程主机上的 Java 程序的资源占用情况,但需要在远程主机上运行 jstatd 守护程序

    五、 eclipse Memory Analyzer

    Eclipse 提供的一个用于分析JVM 堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。

    http://www.eclipse.org/mat/

  • 相关阅读:
    ESB相关技术入门
    推荐两个界面原型设计工具GUIDesignStudio 和 Mockups For Desktop
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
    各大网站架构总结笔记
    NUnit是一款优秀的开源回归测试框架
    2011 年最佳代码
    [转]WinForms UI Thread Invokes: An InDepth Review of Invoke/BeginInvoke/InvokeRequred
    ISAPI_Rewrite引起的IIS应用程序池崩溃(fatal communication error)
    微软一站式示例代码库(中文版)20110808版本, 新添加ASP.NET, Azure, Silverlight, WinForm等15个Sample
    Office系列在线预览
  • 原文地址:https://www.cnblogs.com/yeahwell/p/5307695.html
Copyright © 2011-2022 走看看