前言
不少初级java程序员,使用过的java命令就那么几个。
- 使用java -version查看java版本
- 使用java -jar启动springboot程序
- 使用jps查询进程
在真实的环境,往往会遇到一些JVM内存和CPU问题,对于这种问题,很多处理方式就是重启服务器,但是过一段时间有出现JVM占用过多的资源,导致程序响应超时,甚至OOM直接进程无法恢复正常使用。
查看java版本
java -version
编译java文件
先写一个简单的java文件Demo.java
import java.time.LocalDateTime;
public class Demo {
public static void main(String[] args) {
new Thread(() -> {
while (true) {
System.out.println(LocalDateTime.now());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
然后使用javac命令执行
javac Demo.java
编译完成后就会多出来一个Demo.class的二进制文件
运行class文件
- 运行class文件时,注意不要加.class后缀。
- 由于这里运行一个独立class文件,没有依赖其他的jar包,否则需要加入-cp或者-classpath来引入依赖的jar包。
- 运行命令里,我加入里一些jvm的参数-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError,为了文章后面的内容做准备。
java -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError Demo
这里把我当前的时间打印出来了。
查询java进程
- jps命令可以查询所有java进程,返回了pid(进程id)、进程名称和启动参数
- -l 可以显示进程全名
- -v 可以查看进程的启动参数
jps -lv
这里可以看到里面有两个java进程,一个是jps命令对应的进程,另一个是刚才运行的java进程。显示的列表有进程号、进程名称和启动参数。 如果使用idea运行的情况下,可以看到更多的java进程,包括idea的java进程。idea运行时和启动我们的java项目时,会加入很多的jvm参数。
jstat
命令和结果
jstat -gc 3634 1s 10
- -gc 是查看jvm的各个区间的内存消耗值和gc触发次数
- 3634是刚才使用jps查看到的demo程序的进程号
- 1s 10表示间隔1秒,一共打印10次
- 这里的内存的单位是KB
JVM内存模型
堆内存 = 年轻代(Young) + 年老代(Old) + 元空间(Metaspace) 年轻代 = Eden区 +Survivor1 +Survivor2
命令返回的列表中,各个列的含义
S0C、S1C、S0U、S1U:Survivor 0/1区分配的最大容量(Capacity)和使用量(Used) EC、EU:Eden区分配的最大容量和使用量 OC、OU:年老代(Old)分配的最大容量和使用量 MC、MU:元空间(Metaspace)分配的最大容量和使用量 YGC、YGT:年轻代GC次数和GC耗时 FGC、FGCT:Full GC次数和Full GC耗时 GCT:GC总耗时
-gcutil可以查看使用率
jstat -gcutil 3634 1s 10
S0、S1:Survivor 0/1区使用率/百分比 E:Eden区使用率/百分比 O:年老代使用率/百分比 PC、PU:永久代分配的最大容量和使用量 YGC、YGT:年轻代GC次数和GC耗时 FGC、FGCT:Full GC次数和Full GC耗时 GCT:GC总耗时
显示jstat所有可以使用的选项
列出所有可以使用的jstat选项
jstat -options
想知道它们的具体含义使用man命令就可以查看,这里就需要一定的英文能力了
man jstat
其它的都差不多,就不全部贴出来了。
|