结合周志明著的《深入理解Java虚拟机第三版》
JAVA与C++之间有一堵由内存动态分配和垃圾收集技术围成的高墙,墙外面的人想出去,墙里面的人却想出来。
首先需要注意的是:jdk安装好了之后,不是通过双击bin目录下的应用程序来使用的,是设置环境变量
JAVA_HOME=“jdk目录”,再在path环境变量后面追加%JAVA_HOME%\bin; 然后再直接在cmd里面使用相关命令,否则直接使用的的话会发生闪退的情况。
我使用的是JDK 15 采用的垃圾回收器是ZGC
jps:虚拟机进程状况工具
JVM Process Status Tool
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-v | 输出虚拟机进程启动时的JVM参数 |
-l | 输出主类的全名,如果进程执行的是jar包,输出jar包的路径 |
功能虽然比较单一,但是使用的频率是很高的,因为需要根据此来获取LVMID以供其他的工具使用.
使用的格式:在cmd中 jps [optins] [hostid]
实例分析与使用:
我打开了一个java程序,程序处于运行状态:
然后打开任务管理器:
可以看到在我的任务管理器中,有两个java程序在运行?分别有自己的PID。接下来我使用jps:
9384是jar包在执行,8284是我开启的程序。
jstat:虚拟机统计信息监视工具
介绍: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工具主要选项:
选项 | 作用 |
---|---|
-class | 监视类加载、类卸载、总空间以及类装载所耗费的时间 |
-gc | 监视java堆的情况,包括Eden区,两个Survivor、老年代、永久代等的容量,已用空间、垃圾收集时间合计 |
-gcutil | 与gc内容基本相同,单输出主要关注于已经使用的空间占总空间的百分比 |
-gacapacity | 与-gc内容基本相同,但是主要关注Java堆各个区域使用到的最大最小空间 |
-gccause | 与-gcutil功能一样,但是会输出导致上一次垃圾收集产生的原因 |
–gcnew | 监视新生代垃圾收集情况 |
-gcnewcapacity | 监视内容与-gcnew相同,主要关注使用到的最大最小空间 |
–gcold | 监视新生代垃圾收集情况 |
-gcoldcapacity | 监视内容与-gcnew相同,主要关注使用到的最大最小空间 |
-complier | 输出即时编译器编译过的方法、耗时等信息 |
-printcompilation | 输出已经被编译的方法 |
随便写创建一个创建对象的程序如下:
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