JVM优化相关命令

本文详细介绍了JVM调优的重要性、调优时机、基本原则和目标,以及如何通过调整JVM参数来优化性能。讨论了常用的JVM调优参数,如堆内存、年轻代和年老代的设置,并提到了如-Xmx、-Xms、-XX:NewRatio等关键参数。此外,还列举了诸如jps、jstat、jstack、jmap和jhat等实用命令,以及推荐的JVM监控和分析工具,如Jconsole和VisualVM。最后,推荐了GC日志分析工具GCeasy,帮助进行详细的日志分析。
一、性能调优

​ 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等等。
​ 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。

二、何时进行JVM调优

遇到以下情况,就需要考虑进行JVM调优了:
Heap内存(老年代)持续上涨达到设置的最大内存值;
Full GC 次数频繁;
GC 停顿时间过长(超过1秒);
应用出现OutOfMemory等内存异常;
应用中有使用本地缓存且占用大量内存空间;
系统吞吐量与响应性能不高或不降。

三、JVM调优的基本原则

​ JVM调优是一个手段,但并不一定所有问题都可以通过JVM进行调优解决;因此,在进行JVM调优时,我们要遵循一些原则:
大多数的Java应用不需要进行JVM优化;
大多数导致GC问题的原因是代码层面的问题导致的(代码层面);
上线之前,应先考虑将机器的JVM参数设置到最优;
减少创建对象的数量(代码层面);
减少使用全局变量和大对象(代码层面);
优先架构调优和代码调优,JVM优化是不得已的手段(代码、架构层面);
分析GC情况优化代码比优化JVM参数更好(代码层面)。
​ 通过以上原则,我们发现,其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”。

四、JVM调优目标

​ 调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。JVM调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量,总结以下:
延迟:GC低停顿和GC低频率;
低内存占用;
高吞吐量。
​其中任何一个属性性能的提高,几乎都是以牺牲其他属性性能的损为代价的,不可兼得。具体根据在业务中的重要性确定。

五、JVM调优量化目标

​ 下面展示了一些JVM调优的量化目标参考实例:
Heap 内存使用率 <= 70%;
Old generation 内存使用率 <= 70%;
avgpause <= 1秒;
Full GC 次数 0 或 avg pause interval >= 24小时。
​ 注意:不同应用的JVM调优量化目标是不一样的。

六、JVM参数

​ JVM调优最重要的工具就是JVM参数。先来了解一下JVM参数相关内容。
​ -XX 参数被称为不稳定参数,**此类参数的设置很容易引起JVM性能上的差异,使 JVM 存在极大的不稳定性。**如果此类参数设置合理将大大提高JVM的性能及稳定性。

不稳定参数语法规则包含以下内容:
布尔类型参数值:
-XX:+ ‘+’表示启用该选项
-XX:- ‘-’表示关闭该选项
数字类型参数值:
XX: = 给选项设置一个数字类型值,可跟随单位,例如:‘m’或‘M’表示兆字节;‘k’或‘K’千字节;‘g’或‘G’千兆字节。32K与32768是相同大小的。
字符串类型参数值:
-XX: = 给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。例如:-XX:HeapDumpPath=./dump.core

七,常用参数设置

堆设置
-Xmx4g:堆内存最大值为4GB。
-Xms4g:初始化堆内存大小为4GB。
-Xmn1200m:设置年轻代大小为1200MB。增大年轻代后,将会减小年老代大小,Sun官方推荐配置为整个堆的3/8。
-Xss512k:设置每个线程的堆栈大小。
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。**设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=8:设置年轻代中Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:PermSize=100m:初始化永久代大小为100MB。
-XX:MaxPermSize=256m:设置持久代大小为256MB。
-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。设置为15年轻代对象15次后放入老年代。

堆收集器

-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器

-XX:+UseG1GC:使用G1做为GC收集器
-XX:+UseConcMarkSweepGC:设置并发收集器CMS

垃圾回收统计信息

-XX:+PrintGC:输出形式:
[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails:输出形式:
[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps:打印GC停顿耗时
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间.
-XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息
-Xloggc:filename:把相关日志信息记录到文件以便分析.
八,常用命令

1,jps 可查看进程id
在这里插入图片描述
2,jinfo查看jvm参数
在这里插入图片描述
3,jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。
在这里插入图片描述
4,jstack查看jvm线程快照命令,定位线程出现长时间卡顿原因,如死锁,死循环
jstack -l 15716
在这里插入图片描述
5, jmap 可以生成java程序的dump文件 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及finalizer 队列
-dump: 生成java堆的dump文件
dump-options: live 只转储存活的对象,如果没有指定则转储所有对象
format=b 二进制格式
file= 转储文件到
在这里插入图片描述
6,jhat 是用来分析jmap生成dump文件的命令
在这里插入图片描述
在这里插入图片描述

九,jvm常用工具

Jconsole 监控管理工具
VisualVM 可视化优化工具
在%JAVA_HOME%\bin目录下, 启动jvisualvm.exe进入主界面, 点击"工具"→"插件"→"可用插件"选项, 选择所需的插件
安装。
在这里插入图片描述
在这里插入图片描述

十,GC日志分析

在这里插入图片描述
GCeasy在线分析日志的工具,地址:https://gceasy.io/ 把生成的日志文件,上传分析,就会接到可视化界面

-Xms100M -Xmx100M -XX:SurvivorRatio=8 -XX:+PrintGCDetails -Xloggc:D://logs/gc.log

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值