参考视频【java】jvm指令与工具jstat/jstack/jmap/jconsole/jps/visualVM_哔哩哔哩_bilibili
一、jps
我们再windows和linux都可以看到哪些java进程。
有小伙伴又会问了 这个类是java的 那其他的这么多进程18096 /8685 这些是啥啊 其实也是java进程,只不过是其他程序,比如idea。
二 、jconsole
由于是图形化界面更加清晰 其实jconsole = jstat+jstack
点击test类,再点击连接,查看详细情况
/** * vmOptions * -Xms10m -Xmx10m * 最小 最大 * -XX:HeapDumpOnOutOfMemoryError */ public class TestJavaUtils { public static void main(String[] args) throws InterruptedException { int i=0; while (true){ System.out.println("put success"); Thread.sleep(1000); } } }注意 要将vm options 设置为 -Xms10m -Xmx10m 否则基本看不到内存变化
可以看到的最大值是9216=10M*1024*0.9 这个0.9就不多说了 有兴趣的自己百度。
这里还可以看到GC。
这个时候有小伙伴就会问了,我知道他GC了对我的工作有什么帮助呢? 我以前也有这个疑问,但是没人解答,这里我告诉你。
为什么我要你设置堆才10M。一半来说就都是1G 2G 甚至10G的内存。因为设置大了,你基本看不到GC,或者GC的时间很短
这里比如我才1分钟就有0.049s的GC时间了,而且我的代码非常简单,复杂10倍不过分吧,那就是0.5s的GC时间,一分钟有0.5s在GC那么是会影响你的正常程序的。例如这篇文章最后,就是GC时间太长CPU负载高,导致任务慢
hadoop中NameNode节点CPU使用量高 解决方案(亲测) - 爱码网
这时小伙伴又会说了 你再windows有图形界面,那我在服务器怎么看
三、jstat
参考文章 https://danny-jiang.blog.csdn.net/article/details/105804076
jstat 是JDK中提供的一个命令行工具,主要用来打印JVM 性能数据相关的统计数据。主要包含以下几个方面:
-
垃圾回收(GC)方面数据
-
编译(Compilation)相关数据
-
类加载信息(Class Loader)
通过jps -l 找到 java的进程号 pid 然后
jstat -gcutil pid 10000 10 这个是看占的比例
jstat -gc pid 10000 10 这个看的是每个空间占的实际大小
jstat -gcnew pid 只看年轻代
jstat -gcold 查看老年代
参数解释:
-gc :打印相关的统计参数
-t: 在每行日志之前加上JVM的启动时间
pid : 目标Java进程的ID
10000: jstat命令执行间隔时间(milliseconds),10000表示每10s打印一行日志
10: jstat命令的执行次数,(和上面的时间间隔一起,表示jstat会每10s执行1次,总共执行10次). 可以不要
这张图可以看到 E区伊甸园区数据不断增多,等到伊甸园区满了来个小GC,就把数据放到幸存者s0区,同时把S1区的数据放到老年代,这时算搞了一次YGC,多了快满的时候就会来个GC
等到老年代数据满了就会来一次OGC
参数意义:
time : JVM启动时间(单位为秒)
S0C :年轻代中S0区的容量 (字节)
S1C :年轻代中S1区的容量 (字节)
S0U :年轻代中S0区目前已使用空间 (字节)
S1U :年轻代中S1区目前已使用空间 (字节)
EC :年轻代中Eden区的容量 (字节)
EU :年轻代中Eden区目前已使用空间 (字节)
OC :老年代的容量 (字节)
OU :老年代目前已使用空间 (字节)
M : MetaspaceSize元空间
CCS : CompressedClassSpaceSize压缩类
YGC :从应用程序启动到采样时年轻代中GC次数
YGCT :从应用程序启动到采样时年轻代中GC所用时间(s)
FGC :从应用程序启动到采样时老年代(全GC)GC次数
FGCT :从应用程序启动到采样时老年代(全GC)GC所用时间(s)
GCT:从应用程序启动到采样时GC用的总时间(s)
这个用法在服务器上也是通用的。。。。通过查看GC次数和时间来检查某些服务是不是内存设置过小。
四、jstack
用法 jstack pid
五、jmap
内存状态可以down下来
jmap -dump:file=filename pid 把内存状态down到本地
jmap -heap pid 打印内存信息
这里打印的比较人性化,其实和jstat差不多.
----后面有机会 找个案例来实战演练