读者福利
更多笔记分享
一、JVM 内存调优
==========
对 JVM 内存的系统级的调优主要的目的是减少 GC 的频率和 Full GC 的次数。
1.Full GC
会对整个堆进行整理,包括 Young、Tenured 和 Perm。Full GC 因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少 Full GC 的次数。
2.导致 Full GC 的原因
1)年老代(Tenured)被写满
调优时尽量让对象在新生代 GC 时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 。
2)持久代 Pemanet Generation 空间不足
增大 Perm Gen 空间,避免太多静态对象 , 控制好新生代和旧生代的比例
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 内存快照 dump。
2.生成堆的 dump 文件
通过 JMX 的 MBean 生成当前的 Heap 信息,大小为一个 3G(整个堆的大小)的 hprof 文件,如果没有启动 JMX 可以通过 Java 的 jmap 命令来生成该文件。
3.分析 dump 文件
打开这个 3G 的堆信息文件,显然一般的 Window 系统没有这么大的内存,必须借助高配置的 Linux,几种工具打开该文件:
-
Visual VM
-
IBM HeapAnalyzer
-
JDK 自带的 Hprof 工具
-
Mat(Eclipse 专门的静态内存分析工具)推荐使用
备注:文件太大,建议使用 Eclipse 专门的静态内存分析工具 Mat 打开分析。
4.分析结果,判断是否需要优化
如果各项参数设置合理,系统没有超时日志出现,GC 频率不高,GC 耗时不高,那么没有必要进行 GC 优化,如果 GC 时间超过 1-3 秒,或者频繁 GC,则必须优化。
注:如果满足下面的指标,则一般不需要进行 GC:
-
Minor GC 执行时间不到 50ms;
-
Minor GC 执行不频繁,约 10 秒一次;
-
Full GC 执行时间不到 1s;
-
Full GC 执行频率不算频繁,不低于 10 分钟 1 次;
5.调整 GC 类型和内存分配
如果内存分配过大或过小,或者采用的 GC 收集器比较慢,则应该优先调整这些参数,并且先找 1 台或几台机器进行 beta,然后比较优化过的机器和没有优化的机器的性能对比,并有针对性的做出最后选择。
6.不断的分析和调整
通过不断的试验和试错,分析并找到最合适的参数,如果找到了最合适的参数,则将这些参数应用到所有服务器。
三,阿里关于 jvm 性能调优的面试真题:
=====================
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
Spring Cloud实战
Spring Boot实战
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)