我以为对 jvm 性能调优很了解,直到我到阿里面试完之后
相信很多人对于性能调优都不陌生,为了获得更好的系统性能,或者是为了满足不断增加的业务需求。
都需要用到我们的性能调优。所以性能优化在面试中出现的频率特别高
楼主自认为自己对性能优化相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。
但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在性能优化方面的知识,只是个小学生水平。
以下,是我总结的一次阿里面试中关于 jvm 性能优化的面试问题以及知识点。
一、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 性能调优的面试真题:
java 类加载过程
java 内存分配
描述一下 jvm 加载 class 文件的原理机制?
GC 是什么?为什么要有 GC?
如何判断一个对象是否存活?
垃圾回收的优点和原理。并考虑两种回收机制。
java 中会存在内存泄漏吗,请简单阐述
JVM 的永久带中会发生垃圾回收吗?
java 中垃圾收集的方法有哪些
解析不在这里一一给大家展示出来了,为了准备面试收集了很多大厂的面试真题,包括有性能优化,微服务,并发编程,开源框架,分布式等专题。
获取方式:关注小编+转发文章+私信【面试真题】获取。
jvm 性能调优学习笔记:
xmind 思维导图
线程
JVM 内存区域
JVM 运行时内存
垃圾回收与算法
JAVA 四中引用类型
GC 分代收集算法 VS 分区收集算法
GC 垃圾收集器
JAVA IO/NIO
JVM 类加载机制
学习笔记每个 jvm 的知识点都会有详细的分析到,最后,学习笔记,除了 jvm 这个知识点外,还包括了很多知识点,其中包括了有基础知识、Java 集合、多线程并发、spring 原理、微服务、Netty 与 RPC 、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等
最后这里就不多展示了,需要领取这份笔记的同学们,点击这里 即可获取
1080 道大厂面试真题。
评论