Java中怎么监控一个应用的性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
标准参数(Eg.)
-help
-server/-client
-version/-showversion
-cp/-classpath
X参数(非标准化参数)
-Xint: 解释执行
-Xcomp: 第一次使用就编译成本地代码
-Xmixed: 混合模式,jvm自己来决定是否编译成本地代码
XX参数(非标转化参数,相对不稳定,主要用于JVM调优和Debug)
XX参数的分类:
-Xmx/-Xms
(实际上是XX参数) 设置JVM的最大内存和最小内存,-Xms等价于-XX:InitialHeapSize
,-Xmx等价于-XX:MaxHeapSize
-XX:+PrintFlagsInitial
查看JVM运行参数的初始值
-XX:+PrintFlagsFinal
查看JVM运行参数的最终值(=表示默认值,:=表示被用户或者JVM修改后的值)
-XX:+UnlockExperimentalVMOptions
解锁实验参数
-XX:+UnlockDiagnosticVMOptions
解锁诊断参数
-XX:+PrintCommandLineFlags
打印命令行参数
-XX:+HeapDumpOnOutOfMemoryError
当发生内存溢出了,自动Dump Heap Error
-XX:HeapDumpPath=./
内存溢出HeapDump的日志,./
指的是当前运行目录
Boolean类型: -XX:[+|-]<name>
,例如: -XX:+UseConcMarkSweepGC
非Boolean类型: -XX:<name>=<value>
表示name属性的值是value,例如:-XX:MaxGCPauseMillies=500
jps
jps默认能够看到所有的java进程
-l
参数表示看到具体的Class
!!!需要补全所有的参数
jinfo
jinfo -flag MaxHeapSize [pid]
看到所选择pid的MaxHeapSize的值
jinfo -flags [pid]
看到所选pid的所有参数值,包括被修改的和没有被修改过的
!!!需要补全所有参数
jstat
Loaded
类加载的个数
Bytes
类加载了多少个kBs
Unloaded
类卸载的个数
Bytes
类卸载了多少个kBs
Time
类加载和卸载总共花费的时间
Compiled
完成了多少个编译的任务(把一个方法编译成本地方法)
Failed
编译任务失败的次数
Invalid
编译任务是无效的次数
Time
总的编译时间
FailedType
上一次编译失败的编译类型
FailedMethod
上一次编译失败的类名称或方法名称
S0C\S1C\S0U\S1U
S0和S1的总量和使用量
EC\EU
Eden区总量与使用量
OC\OU
Old区总量与使用量
MC\MU
Metaspace区总量和使用量
CCSC\CCSU
压缩类空间总量和使用量
YGC\YGCT
YoungGC的次数和时间
FGC\FGCT
FullGC的次数和时间
GCT
总的GC时间
可以查看如下信息:
所有选项:
-class
查看类装载信息,用法 jstat -class [pid] [interval millseconds] [count]
代表间隔interval毫秒时间打印count次的pid的类装载信息:
-compiler
查看JIT编译的信息,jstat -compiler [pid] [interval millseconds] [count]
代表间隔interval毫秒时间打印count次的pid的JIT编译信息信息:
-gc
查看垃圾收集的信息,用法 jstat -gc [pid] [interval millseconds] [count]
代表间隔interval毫秒时间打印count次的pid的gc信息:
-gcutil
-gccause
-gcnew
-gcold
-printcompilation
!!!需要补全所有参数
类装载信息
垃圾收集信息
JIT编译信息
JVM的内存结构
堆区:Young区(Servival区[S0+S1]+Eden区) + Old区,S0和S1是一样大的,在同一时间,S0和S1只会启用一个
非堆区(Metaspace):操作系统的本地内存,CCS区(启用了短指针之后则存在)+CodeCache区(存放的是JIT的代码信息,JNI的代码信息也在这)
如何定位内存溢出的问题
构造一个内存溢出,例如设置下-Xmx32M -Xms32M
,构造一个堆内存溢出,只需要一直不停的new对象;设置-XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
下构造出一个非堆内存溢出,例如使用ASM不太的构造Class文件。
内存溢出的区别
C++内存溢出主要是指丢失内存指针,Java的内存溢出主要是指一直占用对象不释放
jmap
-dump:<dump-options>
options有:live
-仅仅导出存活的对象,format=b
-导出二进制格式,file=<file>
代表导出的文件
可以手动导出Heap日志
看完上述内容,你们掌握Java中怎么监控一个应用的性能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。