zoukankan      html  css  js  c++  java
  • jvm问题排查工具、命令

    1. dump生成:jmp -dump:live,format=b,file=/tmp/some.bin PID。其中,加上live表示只dump存活的对象。
    2. 线程栈信息生成:jstack
    3. PID > /tmp/file.txt
    4. 找出占用CPU最多的线程:
      1. top -p PID -h 找到占用CPU最多的线程号(此命令结果显示为PID,对应jstack里的nid)
      2. 获取jstack;
      3. 将上面找到的线id转为十六进制形式,通过grep命令可以从jstack里找到相应的线程信息
      4. grep 'nid' -B 10 -A 10 jstack.txt (使用grep获取前后10行信息)
    5. MAT使用:
      1. Shallow Heap:对象本身占用的空间
      2. Retained Heap:对象本身及它引用依赖的所有对象占用的空间
    6. gc日志相关参数:
       -Xms30m
       -Xmx30m
       -XX:+PrintGCDateStamps
       -XX:+PrintGCDetails
       -XX:+PrintHeapAtGC
       -XX:+PrintGCApplicationStoppedTime
       -Xloggc:/tmp/gc_%p_%t_.log
       -XX:+HeapDumpOnOutOfMemoryError
       -XX:HeapDumpPath=/tmp/
      
      其中%p为进程ID,%t为时间,示例:gc_pid10442_2019-10-13_18-53-41_.log
    7. -Xss理解
      个线程都有自己的Stack Space(堆栈)。这个Stack Space不是来自Heap的分配。所以Stack Space的大小不会受到-Xmx和-Xms的影响,这2个JVM参数仅仅是影响Heap的大小。Stack Space用来做方法的递归调用时压入Stack Frame(栈帧)。所以当递归调用太深的时候,就有可能耗尽Stack Space,爆出StackOverflow的错误。
      -Xss256k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
      线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误.
      JVM可创建的最大线程数限制因素:线程堆栈大小->进程的最大内存->操作系统位数。
      jdk7的xss最小设置允许值为228k,否则jvm启动报错:The stack size specified is too small, Specify at least 228k

    参考文档:

    1. (译)关于使用Eclipse Memory Analyzer的10点小技巧
    2. MAT OQL语法
  • 相关阅读:
    C#和Sql Server 2005中时间的最大值和最小值
    Windows Server 2008 R2 With SP1简体中文版 + 破解补丁
    Merge窗体的制作
    SqlServer2008R2卸载
    Highlighter(高亮控件的边框)
    如何删除window.old文件
    如何全屏WinForm的窗体
    验证时出错。HRESULT = '8000000A'
    ReflectionLabel(倒影控件)
    windows 2003和server 2008 取消对网站的安全检查/去除添加信任网站
  • 原文地址:https://www.cnblogs.com/liqipeng/p/11669137.html
Copyright © 2011-2022 走看看