Java虚拟机性能监控与调优
1 基于JDK命令行工具的监控
1.1 JVM的参数类型
1.1.1 标准参数
在JVM的各个版本基本上保持不变,很稳定的。
-help
-server -client
-version -showversion
-cp -classpath
1.1.2 X参数
非标准化参数
-Xint: 解释执行
-Xcomp: 第一次使用就编译成本地代码
-Xmixed: 混合模式,JVM自己来决定是否编译成本地代码
1.1.3 XX参数
非标准化参数
相对不稳定
主要用于JVM调优和Debug
Boolean类型
格式:-XX:[+-]<name>表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
非Boolean类型
格式:-XX:<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500
-XX:GCTimeRatio=19
-Xmx -Xms
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
| 命令 | 作用 |
| ps -ef|grep java | 查看java的进程相关信息,以及启动的配置信息 |
| jinfo -flag MaxHeapSize pid | 查看该pid的JVM最大的堆内存大小 |
| jinfo -flag ThreadStackSize pid | 查看该pid的JVM每个线程的栈大小 |
1.2 运行时JVM参数查看
-XX:+PrintFlagsInitial
初始值
-XX:+PrintFlagsFinal
最终值

= 表示默认值
:= 被用户或者JVM修改后的值
-XX:+UnlockExperimentalVMOptions 解锁实验参数
-XX:+UnlockDiagnosticVMOptions 解锁诊断参数
-XX:+PrintCommandLineFlags 打印命令行参数
jps
类似与Linux服务器上的ps功能。
相关命令:
jps -help 查看帮助
jps -l 查看正在运行的列表
jps命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html
jinfo命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD
jstack命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html#BABGJDIF
jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB
jinfo
查看正在运行的JVM里面的参数值。
相关命令:jinfo -flag MaxHeapSize pid 查看正在运行的进程为PID的JVM的最大堆内存
jinfo -flags pid 查看正在运行的进程为PID的JVM的已经被修改过的JVM的参数值
查看最大内存

查看垃圾回收器

1.3 jstat查看虚拟机统计信息
类装载
jstat命令详细参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE
参考命令:jstat -class pid 查看类加载的信息
jstat -class pid 1000 10 每隔1000ms打印一次类加载信息,打印10次。

垃圾收集
参考命令:jstat -gc pid 查看进程号为pid的JVM的垃圾收集信息,具体响应详细参数jstat命令详细参考
jstat -gc pid 1000 10 每隔1000ms打印一次进程号为pid的JVM的垃圾收集信息,打印10次。

JIT编译
参考指令:jstat -compiler pid 查看进程号为pid的JVM的即时编译信息。

2 Jmap+MAT实战内存溢出

2.1 模拟对内存溢出的代码参考:
2.2 如何导出内存映像文件
2.2.1 内存溢出自动导出
程序启动的时候,设置以下参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
2.2.2 使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof pid 导出进程号为pid的JVM的dump文件
jmap -heap pid 打印进程号为pid的JVM的堆信息
jmap命令
option: -heap, -clstats, -dump:<dump-options>, -F
更多详细命令参考:jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB
2.3 MAT分析内存溢出
MAT工具下载地址:http://www.eclipse.org/mat/downloads.php
将步骤2.2导出的dump文件,用MAT工具打开分析。
2.4 JAVA线程状态
NEW WAITING RUNNABLE TIMED_WAITING BLOCKED TERMINATED
更多详细信息参考:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr034.html
3 实战死循环导致CPU飙高
查找死循环导致CPU飙高问题的常用指令:
top -p pid -H #打印该进程的所有线程,查看占用CPU资源超高的线程ID,该线程ID为10进制,要用下面的命令将其转换为16进制,然后在stack信息中查找详细信息
printf "%x" 十进制的线程id #将十进制的线程id转换为16进制
jstack pid #打印程序的stack信息,从中找出CPU占用超过的线程ID的stack信息
也可以参考:https://www.cnblogs.com/alsodzy/p/10188691.html,来排查CPU飙高的问题。
Java虚拟机性能监控与调优的更多相关文章
- Java虚拟机性能监控与调优实战
From: https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...
- Java项目性能监控和调优工具-Javamelody的学习总结
1.简介: JavaMelody能够在运行环境监测Java或Java EE应用程序服务器.并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http ...
- JAVA性能监控与调优参考文档链接
JAVA性能监控与调优参考文档链接 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.htmlTroub ...
- Java生产环境下性能监控与调优详解
1:JVM字节码指令与 javapjavap <options> <classes>cd monitor_tuning/target/classes/org/alanhou/m ...
- Java生产环境下性能监控与调优详解视频教程 百度云 网盘
集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...
- <JVM下篇:性能监控与调优篇>补充:使用OQL语言查询对象信息
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
随机推荐
- 10.29 scrum meeting newbe软件团队工作分配
这次会议,我们主要讨论了目前阶段的主要任务与任务分配问题. 首先,通读代码,理解程序的运行方式是必不可少的环节.所以我们要求团队的所有成员通读代码.并且对于开发人员和测试人员,要求写出我们分配的各自模 ...
- Daily Scrum (2015/10/26)
今晚由于我们组成员就团队Week5作业的个人贡献分开会协商,所以把今天的编码工作往后延迟了.考虑到有些成员代码还没理解够,正好TFS的代码阅读分配的工作时间还没进行完,所以在会议之后我们让成员回寝自由 ...
- imooc-c++学习感悟
imooc--慕课网c++课程链接:[课程链接](http://www.imooc.com/course/list?c=C+puls+puls) Imooc 慕课网c++学习感悟 1.课程名称:c++ ...
- 第二次 作业——APP案例分析
APP案例分析 产品 网易云课堂 选择理由 网易云课堂是从大一就开始使用的一款学习软件,有海量的学习资源,很适合学生课余时间的自主学习 调研,评测 上手体验 第一次打开网易云课堂app的时候,进入的是 ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (二) 发送自定义数据
在我的项目里,树莓派主要作为中心节点,用于接收数据,Arduino作为子节点,用于发送数据,考虑到以后会有很多子节点,但又不至于使得代码过于繁琐,因此所有的传输数据添加一个头部编号用于区分不同节点. ...
- debug阶段贡献分
组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:11.29 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成 ...
- HDU 2107 Founding of HDU
http://acm.hdu.edu.cn/showproblem.php?pid=2107 Problem Description 经过慎重的考虑,XHD,8600, LL,Linle以及RPG等A ...
- Robot Framework 教程 (6) - 使用条件表达式
本篇文章,主要对如何在Robot Framework中使用条件表达式做过程控制作说明. 按照Robot Framework的官方文档介绍,Robot Framework并不建议在TestCase或Ke ...
- 读书笔记-《Java核心技术卷I-基础知识》
1.定时器Timer类 构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做什么操作.定时器需要知道调用哪一个方法,并要求传递的对象所属的类实现了java.awt.event包的A ...
- ORA-06530: 引用未初始化的组合 ;
select * FROM TABLE(fun_test_1) : ORA-06530: 引用未初始化的组合ORA-06512: 在 "PCISS.FUN_TEST_1", lin ...