当前位置: 首页 > 后端技术 > Java

JVM性能调优的6大步骤,及关键调优参数详解

时间:2023-04-01 18:17:01 Java

JVM性能调优6大步骤,关键调优参数详解性能调优方法3.JVM性能调优步骤4.JVM调优参数详解JVM内存调优JVM内存系统级调优的主要目的是降低GC的频率和FullGC的次数。1.FullGC会组织整个堆,包括Young、Tenured和Perm。FullGC比较慢,因为需要回收整个堆,所以FullGC的次数要尽量减少。2、FullGC的原因1)老年代(Tenured)满调优时,尽量让对象在新生代GC中被回收,让对象在新生代中存活更长时间,做不要创建太大的对象和数组避免直接在老年代创建对象。2)PermGenerationPemanetGeneration空间不足增加PermGen空间,避免静态对象过多,控制新生代和老年代的比例3)显示System.gc()调用垃圾回收,不触发手动,尽量依赖JVM本身在调优JVM的过程中,很大一部分工作是FullGC的调优。下面详细介绍相应的JVM调优方法和步骤。JVM性能调优方法及步骤1.监控GC状态使用各种JVM工具查看当前日志,分析当前JVM参数设置,分析当前堆内存快照和gc日志,根据各区实际内存划分情况还有GC执行时间,感觉要不要优化。举个例子:系统崩溃前的一些现象:每次垃圾回收的时间越来越长,从之前的10ms到50ms左右,FullGC的时间也从之前的0.5s延长到4、5s.FullGC的次数越来越多,最频繁的是每隔不到1分钟就进行一次FullGC。老一代的内存越来越大。每次FullGC之后,老年代就没有内存可以释放了。系统将无法响应新的请求后,会逐渐达到OutOfMemoryError的临界值,此时需要分析JVM内存快照转储。2.生成堆的dump文件通过JMX的MBean生成当前Heap的信息,大小为3G(整个堆的大小)的hprof文件。如果没有启动JMX,可以通过Java的jmap命令生成该文件。3.分析dump文件,打开3G堆信息文件。显然一般的Windows系统没有这么大的内存,所以必须使用高配置的Linux和几个工具打开文件:VisualVMIBMHeapAnalyzerJDK自带的Hprof工具Mat(Eclipse专用静态内存分析工具)推荐使用备注:文件过大,建议使用Eclipse专用静态内存分析工具Mat打开分析。4.分析结果以确定是否需要优化。如果参数设置合理,系统没有超时日志,GC频率不高,GC耗时不高,那么就没有必要进行GC优化。如果GC时间超过1-3秒,或者FrequentGC就要优化。注意:如果满足以下指标,一般不需要GC:MinorGC执行时间小于50ms;MinorGC执行频率不高,大约每10秒一次;FullGC执行时间小于1s;FullGC执行频率不频繁,不少于10分钟一次;5.调整GC类型和内存分配。如果内存分配过大或过小,或者使用的GC收集器比较慢,首先要调整这些参数,先找一台或几台机器进行beta,然后比较优化后的机器和未优化的机器的性能机,并做出有针对性的最终选择。6.不断的分析和调整通过不断的试错,分析找到最合适的参数,如果找到最合适的参数,就把这些参数应用到所有的服务器上。cms参数优化步骤流程下面我继续介绍一下JVM的关键参数配置(仅供参考)。JVM调优参数参考1.对于JVM堆设置,一般可以通过-Xms-Xmx来限制它的最小值和最大值。最小设置是相同的值;2、新生代和老年代会按照默认的比例(1:2)分配堆内存。可以通过调整NewRadio的比例来调整两者之间的大小,也可以用于回收。例如,新生代的绝对大小由-XX:newSize-XX:MaxNewSize设置。同样,为了防止新生代堆收缩,我们通常将-XX:newSize-XX:MaxNewSize设置为相同的大小。3.合理设置年轻代和老年代的大小1)年轻代越大,必然导致老年代越小。大新生代会延长普通GC的周期,但会增加每次GC的时间;老年代会导致更频繁的FullGC2)年轻代越小必然导致老年代越大,年轻代越小会导致频繁的普通GC,但每次GC时间会更短;老年代大的Generation会降低FullGC的频率。如何选择应该取决于应用程序对象生命周期的分布:如果应用程序中有大量的临时对象,应该选择更大的新生代;如果持久化对象比较多,老年代要适当增加。但是许多应用程序没有这样明显的功能。选择应该基于以下两点:(1)本着尽可能少FullGC的原则,尽可能让老年代缓存普通对象。JVM默认的比例是1:2,也是这个原因。(2)观察应用一段时间,看看老年代在高峰期会占用多少内存。在不影响FullGC的情况下,根据实际情况增加年轻代的大小。例如,比例可以控制在1:1。但至少要为老年代保留1/3的增长空间。4.在配置较好的机器上(如多核、大内存),可以选择老年代的并行收集算法:-XX:+UseParallelOldGC。5、线程栈设置:每个线程默认会开一个1M的栈,用来存放栈帧、调用参数、局部变量等,这个默认值对于大多数应用来说太大了,一般256K就够了。理论上,同样的内存,减少每个线程的栈可以产生更多的线程,但这实际上是受操作系统限制的。以上关于作者:mikechen,10年+大厂架构经验,曾在阿里、淘宝、百度工作,分享架构技术心得与心得!阅读mikechen更多技术文章合集所有合集|Java|JVM|MySQL|Redis|分布式|微服务|高并发|中间件|架构师关注作者公众号mikechen互联网架构,回复【架构】即可获取作者《原创的300期+BAT架构技术系列文章与1000+大厂面试题答案合集》.