常用JVM命令

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

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

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

3、printf "%x\n" 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

活跃数据的大小是指,应用程序稳定运行时长期存活对象在堆中占用的空间大小,也就是Full GC后堆中老年代占用空间的大小。可以通过GC日志中Full GC之后老年代数据大小得出,比较准确的方法是在程序稳定后,多次获取GC数据,通过取平均值的方式计算活跃数据的大小

 

 

 

 

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

幸存代占新生代的1/10

-Xms4:初始时堆内存

-Xmx4:最大堆内存

-Xmn1g:年轻代内存

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

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

-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收集

 

posted @ 2018-08-13 18:16  提拉米苏007  阅读(2096)  评论(0编辑  收藏  举报