jvm实战调优

本文详细介绍了Java虚拟机(JVM)的调优参数,包括GC(垃圾收集器)、Parallel、CMS和G1等不同场景下的常用设置。同时,列举了如-Xmn、-Xms、-Xmx等关键参数的作用,并提到了如何使用JDK内置工具如jps、jstat、jinfo进行性能监控。此外,还讨论了针对系统CPU占用高、内存飙高等问题的排查和调优方法,以及项目整体调优策略,包括数据库优化、集群优化等。
摘要由CSDN通过智能技术生成

实战调优

慢慢补充,先这样吧

常用参数

GC常用参数

  • -Xmn:年轻代
  • -Xms:最小堆
  • -Xmx :最大堆
  • -Xss:栈空间
  • -XX:+UseTLAB:使用TLAB,默认打开
  • -XX:+PrintTLAB:打印TLAB的使用情况
  • -XX:TLABSize:设置TLAB大小
  • -XX:+DisableExplictGC:禁用System.gc()不管用 ,防止FGC
  • -XX:+PrintGC:打印GC日志
  • -XX:+PrintGCDetails:打印GC详细日志信息
  • -XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息
  • -XX:+PrintGCTimeStamps:打印时间戳
  • -XX:+PrintGCApplicationConcurrentTime:打印应用程序时间
  • -XX:+PrintGCApplicationStoppedTime:打印暂停时长
  • -XX:+PrintReferenceGC:记录回收了多少种不同引用类型的引用
  • -verbose:class:类加载详细过程
  • -XX:+PrintVMOptions:jvm参数
  • -XX:+PrintFlagsFinal:该命令可以查看所有JVM参数启动的初始值,必须会用
  • -Xloggc:opt/log/gc.log:gc日志的路径以及文件名称
  • -XX:MaxTenuringThreshold:升代年龄,最大值15

Parallel常用参数

  • -XX:SurvivorRatio:年轻代中eden和from/to的比值。比如设置3就是eden:survivor=3:2,也就是from和to各占1,eden占用3
  • -XX:PreTenureSizeThreshold:大对象到底多大-XX:MaxTenuringThreshold:升代年龄,最大值15
  • -XX:+ParallelGCThreads:并行收集器的线程数,同样适用于CMS,一般设为和CPU核数相同
  • -XX:+UseAdaptiveSizePolicy:自动选择各区大小比例

CMS常用参数

  • -XX:+UseConcMarkSweepGC:设置年老代为并发收集
  • -XX:ParallelCMSThreads:CMS线程数量
  • -XX:CMSInitiatingOccupancyFraction:使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld卡顿,应该调小,(频繁CMS回收)
  • -XX:+UseCMSCompactAtFullCollection:在FGC时进行压缩
  • -XX:CMSFullGCsBeforeCompaction:多少次FGC之后进行压缩
  • -XX:+CMSClassUnloadingEnabled:年老代启用CMS,但默认是不会回收永久代(Perm)的。此处对Perm区启用类回收,防止Perm区内存满。
  • -XX:CMSInitiatingPermOccupancyFraction:达到什么比例时进行Perm回收
  • GCTimeRatio:设置GC时间占用程序运行时间的百分比
  • -XX:MaxGCPauseMillis:停顿时间,是一个建议时间,GC会尝试用各种手段达到这个时间,比如减小新生代

G1常用参数

  • -XX:+UseG1GC:开启G1
  • -XX:MaxGCPauseMillis:建议值,G1会尝试调整Young区的块数来达到这个值
  • -XX:GCPauseIntervalMillis:GC的间隔时间
  • -XX:+G1HeapRegionSize:分区大小,建议逐渐增大该值,1 2 4 8 16 32。随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长 ZGC做了改进(动态区块大小)
  • G1NewSizePercent:新生代最小比例,默认为5%
  • G1MaxNewSizePercent:新生代最大比例,默认为60%
  • GCTimeRatio:GC时间建议比例,G1会根据这个值调整堆空间
  • ConcGCThreads:线程数量
  • InitiatingHeapOccupancyPercent:启动G1的堆空间占用比例

常用调优工具

JDK内置的命令行

  • jps(查看jvm进程信息)
  • jstat(监视jvm运行状态的,比如gc情况、jvm内存情况、类加载情况等)
  • jinfo(查看jvm参数的,也可动态调整)
  • jmap(生成dump文件的,在dump的时候会影响线上服务)
  • jhat(分析dump的,但是一般都将dump导出放到mat上分析)
  • jstack(查看线程的)。

可视化界面

QA环境压测

  • JConsole(QA环境压测)
  • VisualVM(QA环境压测)
  • 阿里巴巴开源的arthas(线上调优)

部分情况分析

  1. 如果有一个系统,内存一直消耗不超过10%,但是观察GC日志,发现FGC总是频繁产生,会是什么引起的?
    检查下系统是否存在System.gc() ;
  2. 线上一个系统跑一段时间就栈溢出了,怎么办 ?
  • 首先检查下是否有死归这种无限递归的程序或者递归方法太多
  • 可以看下栈大小,若太小则可以指定-Xss参数设置栈大小
  1. 系统CPU经常100%,如何调优?

CPU100%,那肯定是有线程一直在占用着系统资源,所以具体方法如下:

  • 找出哪个进程cpu占用高(top命令)
  • 该进程中的哪个线程cpu占用高(top -Hp $pid命令)
  • 将十进制的tid转化为十六进制(printf %x $tid命令)
  • 导出该线程的堆栈 (jstack p i d > pid > pid>pid.log命令)
  • 查找哪个方法(栈帧)消耗时间 (less $pid.log)
  • 可以确认工作线程占比高还是垃圾回收线程占比高
  • 修改代码
  1. 系统内存飙高,如何查找问题?
  • 找出哪个进程内存占用高(top命令)
  • 查看jvm进程号(jps命令)
  • 导出堆内存 (jmap命令生成dump文件,注意:线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿,所以操作前最好先从负载均衡里摘掉。)
  • 分析dump文件 (比如mat软件)

项目调优

  1. 数据库与SQL优化:一般dba负责数据库优化,比如集群主从等。研发负责SQL优化,比如索引、分库分表等。
  2. 集群优化:让整个集群可以很容易的水平扩容,再比如tomcat/nginx的一些配置优化等。
  3. 硬件升级:选择最合适的硬件,充分利用资源。
  4. 代码优化:安装sonar插件这种检测代码质量的工具。
  5. jvm优化:内存区域大小设置、对象年龄达到次数晋升老年代参数的调整、选择合适的垃圾收集器以及合适的垃圾收集器参数、打印详细的GC日志和oom的时候自动生成dump。
  6. 操作系统优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值