JVM快速调优命令汇总

Stella981
• 阅读 731

CPU监控:进程和线程

# 观察哪个进程CPU和内存占比高
top
# 观察进程中的线程,哪个线程CPU和内存占比高
top -Hp  [pid]
# top 16837
# top -Hp 16837
  • 定位具体java进程

    定位具体java进程

    jps

    jps -l

分析 Thread Dump

  • 在线导出堆栈信息

    jstack -l [pid]

    jstack -l 16837

查看GC日志

  • 事前方式 JVM启动时增加VM Option参数:

    -Xloggc:/path/to/log/dir/gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause

  • 在线方式

    每500个毫秒打印GC的情况

    jstat -gc [pid] 500

    jstat -gc 16837 500

获取 Heap Dump

  • 事前方式(建议) JVM启动时增加两个VM Option参数:

    #出现 OOME 时生成堆 dump, 生成堆文件地址 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dir/

  • 事后方式 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件, pid为java程序的进程id。

    jmap -dump:format=b,file=/path/to/dir/dumpfile [pid]

    jmap -dump:format=b,file=serviceDump.dat 16837

注意:jmap 在执行转存储jmap -dump时,JVM是暂停服务的,所以对线上的运行会产生影响

分析 Heap Dump

  • 在线查找 Heap 有多少对象产生

    jmap -histo [pid]

    jmap -histo 16837 | head -20

其他方式: arthas

  • 离线分析 Heap Dump

    启动 http://localhost:7000/

    注意 -J-Xms 之间没有空格

    jhat -port 7000 -J-Xmx2048m 文件名

其他方式: jvisualvm mat jprofiler

by Sven Augustus https://my.oschina.net/langxSpirit

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java多线程常见问题
Java多线程是什么Java提供的并发(同时、独立)处理多个任务的机制。多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级。依我的理解,Java多线程完全就是为了提高CPU的利用率。Java的线程有4种状态,新建(New)、运行(Runnable)、阻塞(Blocked)、结束(Dead),关键就在于阻塞(Bl
Wesley13 Wesley13
3年前
java多线程的学习
1,进程和线程 1,一个进程和另外一个进程的之间是隔离的。但是对cpu来说都是一样的。一边打游戏,一边看电影。2,两个线程是共享着同一片资源,在同一个进程里面,例如在腾讯视频,同时打开两部电影。3,他们的目的都是充分的利用cpu。4,java虚拟机就是一个进程。5,线程的实现两种方式 Runnable接口,继承Threa
lucien-ma lucien-ma
3年前
什么是线程?什么是进程?
Java多线程基础进程和线程的概念应用程序是静态的概念,进程和线程是动态概念,有创建就有销毁,存在也是暂时的,不是永久性的。进程与线程的区别在于进程在运行时拥有独立的内存空间(每个进程所占有的内存都是独立的)多个线程是共享内存空间的,但是每个线程的执行时相互独立的,同时线程必须依赖于进程才能执行,单独的线程是无法执行的,由进程来控制多个线程的执行。
Wesley13 Wesley13
3年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Stella981 Stella981
3年前
JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。第一步先找出Java进程ID,服务器上的Java应用名称为mrfcenter:root@u
Stella981 Stella981
3年前
Eg挨蒙—Zabbix监控进程占cpu和内存大小及批量监控端口
监控简介:通过shell脚本的方式,实现对进程占cpu百分比和内存大小的监控,通过python脚本方式,实现批量监控服务器端口。一、监控进程占cpu的百分比和内存的大小1、在agent端编写脚本\root@monitorsbin\$cat/usr/local/zabbix/scripts/processtatus.sh!/
Stella981 Stella981
3年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Stella981 Stella981
3年前
JVM 调优之 jstack 找出最耗cpu的线程
top命令观察到问题:内存不断增长CPU占用率居高不下!(https://oscimg.oschina.net/oscnet/upe838b490d1a75f988a3076794f329c9947d.png)topHp观察进程中的线程,哪个线程CPU和内存占比高topHp10424