jvm性能优化

1、性能优化步骤

性能监控:一种非强行或侵入方式收集或查看应用运营性能数据的活动。
GC频繁
cpu load过高
OOM
内存泄漏
死锁
程序响应时间较长
性能分析:一种侵入方式收集运行性能数据的活动,他会影响应用的吞吐量或响应性。
打印GC日志,通过GCViewer或者gceasy等分析日志。
灵活运用命令行工具:jstack,jmap,jinfo等。
dump出堆文件,使用内存分析工具分析文件。
使用阿里Arthas,或jconsole,VisualVM来实时产看JVM状态。
jstack查看堆栈信息。
性能调优:一种为改善应用响应性或吞吐量而更改参数、源代码、属性配置的活动,性能调优是在性能监控、性能分析之后的活动。
适当增加内存,根据业务背景选择垃圾回收器。
优化代码,控制内存使用。
增加机器,分散节点压力。
合理设置线程池线程数量。
使用中间件提高程序效率,比如缓存,消息队列等。

2、性能评价/测试指标

停顿时间(或响应时间)
提交请求和返回该请求的响应之间使用的时间,一般比较关注平均时间。
在这里插入图片描述

在垃圾回收环节中:暂停时间—执行垃圾回收时,程序的工作线程被暂停的时间。
吞吐量:对单位时间内完成的工作量(请求)的量度。
在GC中:运行用户代码的时间占总运行时间的比例(总运行时间=程序运行时间+内存回收时间)。吞吐量为1-1/(1+n)。-XXGCTimeRatio=n
并发数:同一时刻,对服务器有实际交互的请求数。
内存占用:Java堆区所占的内存大小。

3.命令行监控工具

jps(java process status):显示制定系统内所有的HotSpot虚拟机进程,用于查询正在运行的虚拟机进程。
参数
-q :仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。
-l:输出对应的主类的全类名,如果是jar包,则输出jar完整路径。
-m:输出虚拟机进程启动时传递给主类main()的参数。
-v:输出虚拟机进程启动时的JVM参数。
在这里插入图片描述

jstat:查看JVM统计信息。
jstat - [-t] [-h] [ []]
参数
-class : 查看类的装载和卸载。
垃圾回收相关的内容:
-gc:显示GC相关的堆信息。
jinfo :查看进程的参数
-flags pid 查询赋值过的一些参数。
-flag 具体参数 pid 查询具体参数的值。
jmap:导出内存影像文件及内存使用情况
-dump :生成dump对象。
手动导出:
1.jmap -dump:format =b, file=<filename.hprof>
2.jmap -dump:live,format =b, file=<filename.hprof>
自动导出:
通过JVM参数。
live:只生成堆中存活的对象。
-heap:输出整个堆空间的详细信息,包括GC的使用,堆配置信息。
jmap -heap pid > 路径
-histo:输出堆中对象统计信息,包括类、实例数量和合计容量。
jmap -histo pid > 路径
jhat:分析dump文件,可通过浏览器的方式查看,在JDK9、JDK10删除,建议使用自带的visualVM。
jstack : 打印JVM中线程快照
jcmd :多功能的工具,除了jstat。
比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执 行GC、JVM运行时间等。
jcmd pid help 可以查看具体参数。

4. 可视化工具

JDK自带
jconsole:JDK自带可视化监控工具
Visual VM
JMC(Java Mission Control)
第三方工具
MAT(Memory Analyzer Tool)
JProfiler
Arthas:Alibaba开源的java诊断工具。
Btrace

5.jconsole

用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监控工具。
可用于内存使用概览,死锁检测。
在这里插入图片描述

6.Visual VM

可用于显示虚拟机进程及进程的配置和环境信息,件事应用程序的CPU、GC、堆、方法区及线程信息等。
作用
生成/读取堆内存快照。
查看JVM参数和系统属性。
查看运行中的虚拟机程序。
生成读取线程快照。
程序资源实时监控
其他功能:JMX代理连接、远程环境监控、CPU分析和内存分析。

7.JProfiler

主要功能
方法调用。
内存分配:通过分析堆上对象,引用链和垃圾收集修复内存泄漏问题,优化内存使用。
线程和锁:JProfiler提供多种针对线程和锁的分析视图,发现多线程问题。
高级子系统,许多性能问题发生在更高的语义级别上。例如对JDBC的调用,找出执行慢的SQL,进行优化。
具体使用
数据采集方式:
Instrumentation(重构采样):全功能模式,在class加载之前,Jprofier把相关功能代码写入到需要分析的class的byte中,对正在运行的JVM有影响。
优点:功能强大,调用堆栈信息准确。
缺点:若分析的类很多,对性能影响较大。
sampling:类似于样本统计,每个一定时间(5s)将每个线程栈中方法栈中信息统计出来。
优点:对CPU开销较低,对应用影响较小。
缺点:一些数据/特性不能提供(例如:方法调用次数、执行时间)。
2.遥感监测Telemetries
3.内存视图Live Memory
分析:
1> 频繁创建的Java对象,死循环,循环次数多。
2>存在大的对象:读取文件时,byte[]应该边写边读—>长时间不写出的 话导致byte[]过大。
3>内存泄漏。
4.CPU视图
5.线程视图 threads
分析:
1>Web容器的线程最大数,例如:Tomcat的线程容量应该略大于最大并发数。
2>线程阻塞。
3>线程死锁。

8、JVM参数选项类型

1、标准参数参数
特点:比较稳定,后续版本基本不会变化。
以” - “ 开头。
运行java -help 可以查看。
-server与-client区别:
Hotspot虚拟机有两种模式,分别是Server和Client。分别通过-server和-client模式设置。
1.在32位windows系统上,默认使用Client类型JVM(C1虚拟机),Client模式适用与对内存要求较小的应用程序,默认使用Serial串行垃圾收集器。
2.想要使用Server模式,机器配置至少为2个CPU和2G以上物理内存
3.64位机器上只支持server模式的JVM,适用于大内存应用,默认使用并行垃圾收集器。
2、-X参数选项
非标准化参数,以” -X “开头
特点:功能还是比较稳定的,但是官方后续版本可能变化。
运行java -X命令可以查看X的选项。
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 ; 分隔的目录和 zip/jar 文件>
设置搜索路径以引导类和资源
-Xbootclasspath/a:<用 ; 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 ; 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc: 将 GC 状态记录在文件中 (带时间戳)
-Xbatch 禁用后台编译
-Xms 设置初始 Java 堆大小
-Xmx 设置最大 Java 堆大小
-Xss 设置 Java 线程堆栈大小
-Xprof 输出 cpu 配置文件数据
-Xfuture 启用最严格的检查, 预期将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用 (请参阅文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据 (默认)
-Xshare:on 要求使用共享类数据, 否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续
JVM编译器相关选项:
-Xint:禁用JIT,所有字节码都别解析执行,这个模式的速度运行最慢。
-Xcomp:所有字节码第一次使用就被编译成本地代码,然后在执行。
-Xmixed:混合模式,默认模式,让JIT根据程序运行情况,有选择的将某些代码编译。
特别的-Xmx,-Xms ,-Xss属于XX参数?
-Xms:设置初始化Java堆大小,等价于-XX:InitiaHeapSize。
-Xmx :设置最大堆内存大小,等价于-XX:MaxHeapSize。
-Xss:设置java线程栈大小,等价于-XX:ThreadStackSize。
3、-XX参数选项
非标准参数,以“-XX”开头。
属于实验性,不稳定,但是是使用最多的。
作用:用于开发和调试JVM。
分类
Boolean类型格式:
-XX:+ 表示启动option属性。
-XX:- 表示禁用option属性。
举例:-XX:UseParallelGC,-XX:+UserG1GC, - XX:+UseAdaptiveSizePolicy 自动选择年轻代区分大小和相应的Survivor区比例。
非Boolean类型格式(key-value类型):
数据型格式:-XX: =
-XX:NewSize=1024M 设置新生代大小。
非数据型格式:-XX: =
-XX:HeapDumpPath=/usr/… 设置堆快照路径。
特别的-XX:PrintFlagsFinal
输出所有参数的名称和默认值,默认不包括Diagnostic和Experimental的参数。

9、添加JVM参数

IDEA

运行jar包
java -Xms50m -jar demo.jar
通过tomcat运行war包
catalina.sh/bat文件中设置”JAVA_OPTS=-Xms512M -Xmx1024M“
程序运行过程中
jinfo -flag = 设置非Boolean类型参数。
jinfo -flag [+|-] 设置Boolean类型参数。
11、常用JVM参数
1、打印设置的XX选项及值。
-XX:+printCommandLineFlags 可以让在程序运行前打印出用户手动设置或者JVM自动设置的选项。
-XX:+PrintFlagslnitial — 标识打印出所有XX选项的默认值。
-XX:PrintFlagsFinal ---- 表示打印出XX选项在运行程序时生效的值。
-XX:PrintVMOptions ----- 打印JVM参数。
2、堆、栈、方法区等

-Xss128k — 设置每个线程的栈大小,等价于-XX:ThreadStackSize=128k。
堆内存
-Xms128m — 初始化大小
-Xmx128m — 最大堆内存大小。
-Xmn2g — 设置新生代大小,等价-XX:NewSize=2g,官方推荐为整堆的3/8。
-XX:MaxNewSize=2g — 设置年轻代最大值。
-XX:SurviorRatio=8 — 设置年轻到Eden区与Survivor区比值,默认为8.
-XX:+UseAdaptiveSizePolicy — 自动设置老年代与年轻代(1个Eden和2个Survior)的比值,默认开启,使-XX:SurviorRatio=8 无效。
-XX:NewRatio=2 — 设置年轻代与老年代的比值,默认是2。
-XX:PretenureSizeThreadshold=1024 — 设置让大于此阀值的对象直接分配在老年代,单位为字节,只对Serial、ParNew收集器有效。
-XX:MaxTenuringThreshold=15 — 默认值是15,新生代每次MinorGC后,存活对象年龄+1,当对象年龄大于设置的这个值时会进入老年代。
-XX:PrintTenuringDistribution — 让JVM每次MinorGC后打印出当前使用的Survivor中对象年龄的分布。
-XX:TargetSurvivorRatio — 表示MinorGC结束后Survivor区域中占用空间期望值比例。
方法区
-XX:MetaspaceSize — 初始元空间大小。
-XX:MaxMetaspaceSize — 最大空间,默认没有限制。
-XX:+UseCompressedOops — 压缩对象指针。
-XX:UseCompressedClassPointers — 压缩类指针。
-XX:CompressedClassSpaceSize — 设置Klass Metaspace的大小,默认1G。
-XX:MaxDirectMemorySize — 指定DirectMemory(直接内存)的大小,默认与堆空间一样大。
3、OutOfmemory相关参数
-XX:+HeapDumpOnOutOfMemoryError — 表示出现OOM的时候,把Heap转储为(Dump)到文件,以便后续分析。
-XX:+HeapDumpBeforeFullGC — 表示在出现FullGC之前,传出Dump文件。
-XX:heapDumpPath= — 指定heap转储文件的存储路径。
-XX:OnOutOfMemoryError — 指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本。

10、垃圾回收器相关选项

-XX:+PrintCommandLineFlags — 查看命令行相关参数(包括使用的垃圾收集器)
Serial回收器:单线程收集效率高。
-XX:+UseSerialGC — 指定年轻代和老年代都是用串行收集器,新生代使用Serial GC,老年代使用Serial Old GC。
ParNew回收器。
-XX:+UseParNewGC — 指定使用ParNew执行年轻代垃圾回收,不影响老年代。
-XX:ParallelGCThreads=N — 限制线程数量,默认开启和CPU数相同的线程数。
Parallel回收器:主打吞吐量。
-XX:+UseParallelGC — 手动指定年轻代Parallel收集器,可相互激活。
-XX:+UseParallelOldGC — 手动指定老年代Parallel收集器,可相互激活。
-XX:ParallelGCThreads=N — 限制线程数量,默认开启和CPU数相同的线程数。
CPU线程数小于8个,XX:ParallelGCThreads数量等于CPU个数。
CPU数量大于8个,XX:ParallelGCThreads值等于3+[5*CPU_COUNT]/8.
-XX:MaxGCPauseMillis — 设置垃圾收集器最大停顿时间(即STW的时间),单位是毫秒。
为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在工作时会调整Java堆大小或者其他-些参数。
对于用户来讲,停顿时间越短体验越好。但是在服务器端,我们注重高并发,整体的吞吐量。所以服务器端适合Parallel,进行控制。
该参数使用需谨慎。
-XX:GCTimeRatio — 垃圾收集时间占总时间的比例(=1/(N+1))。用于衡量吞吐量的大小。
取值范围是(0,100)。默认值99,也就是垃圾回收的事件不超过1%。
与-XX:MaxGCPauseMillis参数有一定的矛盾性。
-XX:+UseAdaptiveSizePolicy — 设置Parallel Scavenge收集器具有自适应调节策略。
在这种模式下,年轻代的大小、Eden 和Survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点。
在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量(GCTimeRatio) 和停顿时间( MaxGCPauseMills),让虚拟机自己完成调优工作。
CMS回收器:使用标记清除算法,JDK9标记废除(仍可使用),JDK14删除CMS垃圾回收器。
-XX:+UseConcMarkSweepGC — 手动指定CMS收集器指定内存回收。
-XX:CMSInitiatingOccupanyFraction — 设置堆内存使用率的阈值,一旦达到便开始进行回收。
JDK5及以前为68,JDK6以后为92。
如果内存增长缓慢,则可以设置1个稍大的值,大的阈值可以有效降低CMS的触发频率,减少老年代回收的次数可以较为明显地改善应用程序性能。反之,如果应用程序内存使用率增长很快,则应该降低这个阈值,以避免频繁触发老年代串行收集器。因此通过该选项便可以有效降低Full GC的执行次数。
-XX:+UseCMSCompactAtFullGCCollection — 用于指定Full GC 后对内存空间进行压缩整理,避免内存碎片的产生。由于内存压缩整理过程中无法并发执行,所带来的问题就是停顿时间变得更长了。
-XX:CMSFullGCsBeforeCompation — 设置在执行多少次FullGC后对内存进行压缩整理。
-XX:ParallelCMSThreads — 设置CMS的线程数量。
CMS默认启动的线程数是(ParallelGCThread+3)/4,ParallelGCThreads 是年轻代并行收集器的线程数。
当CPU资源比较紧张时,CMS收集器受到线程的影响较大,性能降低。

G1回收器
-XX:+UseG1GC
-XX:G1HeapRegionSize — 设置每个Region的大小,值为2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分为2048个区域。默认值为堆内存的1/2000。
-XX:MaxGCPauseMillis — 设置最大GC停顿时间指标(JVM会尽力实现,但是不保证达到),默认值是200ms。
-XX:ParallelGCThread — 设置STW时GC的线程数,最大为8.
-XX:ConcGCThreads — 设置并发标记的线程数,将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右。
-XX:InitiatingHeapOccupancyPercent — 设置触发并发GC周期的Java堆占有率阈值,超过此值就触发GC,默认是45。
-XX:G1NewSizePercent、-XX:G1MaxNewSizePercent — 新生代占用整个堆内存的最小百分比(默认5%)、最大百分比(默认60%)
-XX:G1ReservePercent=10 — 保留内存区域,防止 to space (Survivor中to区)溢出。

11、GC日志相关参数

-Xloggc: — 将GC输出到文件。
-XX:+PrintGC
-XX:+PrintGCDetails — 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况。
-XX:+PrintGCTimeStamps — 打印时间戳,需要配合上述参数使用。
-XX:+PrintGCDateStamps — 打印日期时间,需要配合上述参数使用。
-XX:+PrintHeapAtGC — 打印GC前后堆空间信息。

12、其他参数

-XX:+TraceClassLoading — 监控类的加载。
-XX:+PrintGCApplicationStoppedTime — GC时线程停顿时间。
-XX:+PrintGCApplicationConcurrentTime — 垃圾收集之前打印出应用为中断的执行时间。
-XX:+PrintReferenceGC — 记录回收了多少种不同类型的引用。
-XX:+PrintTenuringDistribution — 让JVM在每次MinorGC之后打出当前使用的Survivor中对象的年龄分布。
-XX:+UseGFLogFileRotation – 启动GC日志文件自动转储。
-XX:NumberOfGClogFiles=1 — GC 日志文件的循环数目。
-XX:GCLogFileSize=1M — 控制GC日志文件的大小。

13、通过Java代码获取JVM参数。

提供java.lang.management包,用于管理监视Jvm和java 运行时其他组件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值