带你整理面试过程中关于JVM 调优的相关知识

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你整理面试过程中关于JVM 调优的相关知识相关的知识,希望对你有一定的参考价值。

文章目录

一、设置 JVM 参数

JVM 参数:点击可参考

IDEA 配置JVM的初始堆和最大堆均为 10m:

client模式:
初始堆大小:物理内存的1/64,最小为 8MB
最大堆:物理内存没有达到192MB之前,JVM最大堆为物理内存的一半,物理内存大于192MB,但是小于 1GB 时,JVM 最大堆大小为物理内存的 1/4;
大于1GB物理内存时,最大堆为256MB

server模式:
初始堆:与client一致
但是最大堆大小可以更大,比如64位机器4G内存,初始堆为64MB,最大堆为1GB

启动程序开始学习JVM 调优:

二、jps 指令

jps(Java Virtual Machine Process Status Tool)伴随 java 安装,是一个显示当前所有 java 进程 pid 的命令

jps 仅用来查找当前用户的 Java 进程,而不是当前系统的所有进程


具体 [options]选项解析:

-q:仅输出VM标识符,不包括classname,jar name,arguments in main method;
-m:输出main method的参数;
-l:输出完全的包名,应用主类名,jar的完全路径名;
-v:输出jvm参数 ;
-V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 ;

运行示意:

三、jconsole 指令

JConsole 是一个内置 Java 性能分析器,可以从命令行(直接输入jconsole)或在 GUI shell (jdk\\bin下打开)中运行。

伴随 Java 安装

CMD 窗口执行:jconsole

然后弹出界面中,选择要连接的进程,连接

选择不安全的连接即可:

可以通过 jconsole 查看具体的详细信息

四、jstat 指令

命令格式:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数:

如下表示分析进程id为 22452 的gc情况,每隔1000ms打印一次记录,打印5次停止,每3行后打印指标头部

jstat -gc -h3 22452 1000 10


(1)显示和gc相关的堆信息:jstat -gc

jstat -gc xxxx

对应的指标含义:

(2)显示垃圾收集信息:jstat -gcutil

jstat -gcutil xxxx

其对应的指标含义如下:

(3)显示各个代的容量以及使用情况:jstat -gccapacity

jstat -gccapacity xxxx

其对应的指标含义如下:

五、jstack 指令

jstack 是 java 虚拟机自带的一种堆栈跟踪工具。jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息

打印的信息和 jconsole 中的图形化线程查看到的一致:

虽然 jconsole 图形化界面很好用,但是服务器并没有图像化界面,所以该指令还是有用的

六、jmap 指令

命令 jmap 是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

指令:

no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump:<dump-options>:生成堆转储快照
F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
help:打印帮助信息
J<flag>:指定传递给运行jmap的JVM的参数

例如:dump 生成堆转储快照dump文件。

生成的 dump 文件可以通过 visualvm 进行查看

七、visualvm

JDK14起,已不再集成visualvm,需要自己去visualvm官网下载
下载地址:https://visualvm.github.io/

下载完成后,在etc文件夹下找到visualvm.conf文件,打开,并设置jdk路径。

设置完成保存即可。

然后在bin文件夹下找到visualvm.exe启动程序,启动visualvm


然后就可以使用查看需要的信息:

这里的 heap Dump 就类似与jmap中的 dump 指令:

可以查看具体信息:

也可以对对象的使用情况进行分析

所以可以分析占用内存特别高时可以通过dump分析哪里出问题了,解决问题

也可以加载已下载的 dump 文件:

八、补充

平时运行代码,也可以设置当发生内存溢出时,把代码dump打印出来:

-XX:+HeapDumpOnOutOfMemoryError


可以看到,当发生内存溢出时,会自动dump 堆文件到该程序主目录下

然后通过 visualvm 查看文件可以发现,占用最大的对象是 Integer 对象:

以上是关于带你整理面试过程中关于JVM 调优的相关知识的主要内容,如果未能解决你的问题,请参考以下文章

带你整理面试过程中关于JVM 的运行机制多线程和 JVM 的内存区域的相关知识点

带你整理面试过程中关于 JVM 中分代收集算法分区收集算法和垃圾收集器的相关知识

带你整理面试过程中关于ThreadLocal的相关知识

带你整理面试过程中关于锁的相关知识点下

带你整理面试过程中关于ARP 协议的相关知识点

带你整理面试过程中关于多线程中的线程池的相关知识点