辽宁建设厅规划设计网站,人才网官方网站,绍兴网站建设哪家专业,黄骅市天气预报最新各命令的使用
JMAP
1、查看内存信息#xff0c;对象实例数、对象占有大小
jmap -histo 进程号./log.txt2、查看堆的配置信息和使用情况
jmap - heap 进程号3、将堆的快照信息dump下来#xff0c;使用java自带的jvisualvm.exe打开分析
jmap -dump:formatb,filedump.h…各命令的使用
JMAP
1、查看内存信息对象实例数、对象占有大小
jmap -histo 进程号./log.txt2、查看堆的配置信息和使用情况
jmap - heap 进程号3、将堆的快照信息dump下来使用java自带的jvisualvm.exe打开分析
jmap -dump:formatb,filedump.hprof 进程号Jstack
查看线程信息死锁时用到可以查看线程阻塞信息
jstack -l 进程号 jstack.logjstat
查看gc日志
jstat -gc 进程号持续打印gc日志
jstat -gc 进程号 1000 10其他
1、jvisualvm.exe可以开启远程连接但生产一般不用。只能在测试服务器上进行压测的时候可以开启。开启需要在服务器上加命令自行百度 2、记录下outofmemory时的dump文件
-Xmx10M -Xms10M
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPathD:/dump.dumpdump下来的文件使用java自带的jvisualvm.exe打开分析
实战例子
cpu飙高定位问题
top 查看占用较大的进程号使用 top -p 进程再按大写的H 查看该进程下对应的线程情况找到占有最大的线程idjstack -l 进程号用jstack打出来的线程nid和top -p 查到的线程进行对比。就能得到对应的代码信息注意jstack 里面的线程信息 nid是16进制的top里面找到的线程信息需要转换一下
优化full gc
目的让朝生夕死的对象在年轻代就干掉不要给他到达老年代 案例 线上系统频繁发生full gc。有卡顿但是线上的系统压力也不是很大。 1、通过jstat -gc 进程号 查看gc情况 机器和GC情况
机器配置2核4GJVM内存大小2G系统运行时间7天期间发生的Full GC次数和耗时500多次200多秒期间发生的Young GC 次数和耗时1万多次500多秒大致算下来每天会发生70多次Full GC,平均每小时3次每次Full GC在400毫秒左右每天会发生1000多次Young GC, 每分钟会发生一次每次Young GC 在50毫秒左右上述数据对任何一个线上系统用jstat -gc 进程号可以轻松看出来因为jstat显示出来的Full GC和Young GC的次数都是系统启动以来的总次数。可回看上方jstat -gc命令的介绍
JVM的参数设置如下 -Xms1536M -Xmx1536M -Xmn512M -Xss256K -XX :SurvivorRatio6 -XX:MetaspaceSize256M
-XX:UseParNewGC -xx:UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction75 -XX:UseCMSInitiatingOccupancyOnly计算各区大小 jvm总内存1536M 新生代堆内存-Xmn512MSurvivorRatio6根据比例得知伊甸园区幸存1区幸存2区 6:1:1。伊甸园区 384M幸存1区 64M幸存2区 64M幸存1区与二区内存相同是否是进行youngGC的时候将一区挪到二区或从二区挪到一区 老年区 堆大小1536-新生代堆521 1G 条件youngGC 7天1万次大概每隔1分钟发生一次youngGC一分钟占满伊甸园区384M每秒会产生6M对象 fullGC 大概每20分钟一次因为XX:CMSInitiatingOccupancyFraction设置的75%。所有每20分钟大概有700M的对象移入老年代 验证调整 分析为什么会频繁触发fullGC youngGC 7天1万次 平均一分钟一次youngGC 也就是每60秒会占满伊甸园区384M youngGC 在10秒到60秒一次算是比较正常的。而且每次youngGC完只剩下几十MB进入到幸存区只是偶尔会有一两次幸存区放不下才会进到老年代。 这里youngGC并不频繁但是FULLGC却那么频繁有点反常 猜测触发FULLGC很可能是有大对象或者触发空间担保机制进入到了老年代 大对象是因为产生的对象伊甸园区放不下了直接就放到了老年代 这个时候我们通过jstat运行的时候就观察到一个现象就是老年代里的内存占用在系统运行的时候不知道为什么系统运行着运行着就会突然有几百MB的对象占据在里面大概有五六百MB的对象一直占据在老年代中。那只能是有大对象生成 分析到这里就很简单了就先用jstat命令观察老年代突然进入几百兆对象。然后将内存dump下来。Visual VM之类的可视化工具来分析dump内存快照 直接定位出来那个几百MB的大对象就是几个Map之类的数据结构。根据业务排查有SQL会在特定场景下select * from tbl后面的where条件都没有用上导致查询出大量数据从而这些对象都进入到老年代引发fullGC
参考https://www.jianshu.com/p/b6d2aa15c2a8