结合周志明著的《深入理解Java虚拟机第三版》
JAVA与C++之间有一堵由内存动态分配和垃圾收集技术围成的高墙,墙外面的人想出去,墙里面的人却想出来。
首先需要注意的是:jdk安装好了之后,不是通过双击bin目录下的应用程序来使用的,是设置环境变量
JAVA_HOME=“jdk目录”,再在path环境变量后面追加%JAVA_HOME%bin; 然后再直接在cmd里面使用相关命令,否则直接使用的的话会发生闪退的情况。
我使用的是JDK 15 采用的垃圾回收器是ZGC
JVM Process Status Tool
功能虽然比较单一,但是使用的频率是很高的,因为需要根据此来获取LVMID以供其他的工具使用.
使用的格式:在cmd中 jps [optins] [hostid]
实例分析与使用:
我打开了一个java程序,程序处于运行状态:
然后打开任务管理器:
可以看到在我的任务管理器中,有两个java程序在运行?分别有自己的PID。接下来我使用jps:
9384是jar包在执行,8284是我开启的程序。
介绍:jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI的图形界面,只提供纯文本控制台环境的服务器上,它将是运行期定位虚拟机问题所在的常用工具。
命令格式:jstat [option vmid [interval[s|ms] [count] ] ]
对于本地的虚拟机进程,VMID与LVMID是一致的;如果是远程虚拟机进程,那么,LVMID的格式如下:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这两个参数,代表只查询一次。
eg:jstat -gc 2764 250 20
代表没250毫秒查询一次进程2764的垃圾收集状况,一共查询20次。
jstat主要针对检测:垃圾回收 类加载 运行期编译。
jstat工具主要选项:
随便写创建一个创建对象的程序如下:
package JVM学习样例; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main2 { static class TestClass{ private byte[] bytes=new byte[64*1024]; } public static void main(String[] args) throws InterruptedException { while (true){ new Main.TestClass(); } } }
开始执行程序 并且使用jstat检测堆的情况:
S0 S1分别代表survivor0 1 E带表Eden空间占用百分比 O代表老年代空间占用百分比 M YGC代表垃圾回收次数 TGCT表示新生代垃圾回收使用时间 FGC表示发生Full GC的次数 FGCT 代表FGC垃圾回收占用的时间 GCT表示垃圾回收一共耗时。对于O M CGC CGCT目前先不做研究。
由于我的代码没有加sleep停顿,因此产生的速度过快,在我使用jstat的时候 可以看到新生代的垃圾回收次数因为程序产生数据过多,发生了很多次了已经,Eden会接近饱和状态,在垃圾回收的功能下,一直释放空间,随着程序的运行,一直被填充,然后回收。
总结:虽然使用jstat不如可视化工具表现得那样直观,但是在实际的生产环境中可能不一定能够使用图像界面,服务器大多数管理员习惯了在文本控制台工作,直接使用jstat仍然是常用的监控方式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)