• 常用JVM命令


    一、查看一台机器上最耗cpu的线程

    1、top -c 查看最耗cpu的进程

    2、top -Hp pid 找出进程中最耗cpu的线程

    3、printf "%x " 21742 线程id转16进制

          jstack 进程id| grep 16进制线程id

    二、分析某进程中内存收回情况

    1、ps -ef|grep 进程名         查找运行中的进程

    2、jstat -gcutil pid 500 3  (24253 pid;500 0.5秒;3次)

    通过 jstat 来监视23998的Java进程统计信息,各项监视参数:

    S0、S1 代表两个Survivor区;

    E 代表 Eden 区;

    O(Old)代表老年代;

    P(Permanent)代表永久代;

    YGC(Young GC)代表Minor GC;

    YGCT代表Minor GC耗时;

    FGC(Full GC)代表Full GC耗时;

    GCT代表Minor & Full GC共计耗时。

    1、使用top查看消耗用户态cpu高的进程
    可以在交互区输入shift+p 按照cpu排序
    可以在交互区输入shift+m 按照内存排序
    可以在交互区输入shift+H 查看进程下的线程
    top -p 进程号,查看某个进程
    top,查看所有进程

    2、查看进程下的所有线程信息
    top -H -p 1963(进程号)
    可以在交互区输入shift+t 按照占用cpu时间排序
    将占用时间高的线程号1966 转化为十六进制
    printf %x 1966 ===》7ae

    3、查看线程下的哪个方法造成cpu高
    jstack 1963|grep 0x7ae

    4、jmap -heap pid 展示pid的整体堆信息

          jmap -histo pid 展示class的内存情况

          jmap -dump:live,format=b,file=a.log pid 将内存使用的详细情况输出到文件

    1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
    2.要制作堆Dump可以直接使用jvm自带的jmap命令
    3.可以先使用jmap -heap命令查看堆的使用情况,看一下各个堆空间的占用情况。
    4.使用jmap -histo:[live]查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
    5.也可以使用 jmap -dump:format=b,file=<fileName>命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容
    6.在内存出现泄露、溢出或者其它前提条件下,建议多dump几次内存,把内存文件进行编号归档,便于后续内存整理分析。

    7.在用cms gc的情况下,执行jmap -heap有些时候会导致进程变T,因此强烈建议别执行这个命令,如果想获取内存目前每个区域的使用状况,可通过jstat -gc或jstat -gccapacity来拿到。

    Java 堆分为新生代老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。

    对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。

    Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。

    当 Eden 区域分配不足时,自动发生一次 Minor GC

    当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升<剩余,则去检测老年代的内存担保 HandlePromotionFailure 是否允许担保失败,如果不允许担保失败,则发生一次Full GC,如果允许失败,则进行一次Minor GC。

    引用:https://www.cnblogs.com/orientsun/archive/2012/07/25/2608545.html

    官方推荐新生代占堆的3/8

    幸存代占新生代的1/10

    -Xms4:初始时堆内存

    -Xmx4:最大堆内存

    -Xmn2g:年轻代内存

    -Xss1024K:一个线程的堆栈大小(1M)

    -XX:PermSize=256:初始永久代内存

    -XX:MaxPermSize=512m:最大永久代内存

    -XX:ParallelGCThreads=8:并行收集器的线程数

    -XX:+UseConcMarkSweepGC:并发标记清除(CMS)收集器

    -XX:+UseParNewGC:并行收集

    -XX:+UseCMSCompactAtFullCollection://在FULL GC的时候对年老代的压缩

    -XX:NewRatio:新生代与老年代比值,例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5

    -XX:SurvivorRatio=4:设置两个Survivor区和eden的比值,例如:4,表示两个Survivor:eden=2:4,即一个Survivor占年轻代的1/6

    -XX:MaxTenuringThreshold=10:垃圾最大年龄

    -XX:CMSInitiatingOccupancyFraction=80://使用80%后開始CMS收集

  • 相关阅读:
    23种设计模式目录总览
    Unity3d优化总结2
    Unity3d优化总结1
    Unity四元数和旋转
    浅谈Unity中的GC以及优化
    Unity自带寻路Navmesh
    High-level NavMesh Building Components
    Unity3D的四种坐标系
    安装SQLserver2008r2出现 试图执行未经授权的操作
    C#获取上传文件的扩展名
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9469989.html
Copyright © 2020-2023  润新知