相信很多人对于性能调优都不陌生,为了获得更好的系统性能,或者是为了满足不断增加的业务需求。
都需要用到我们的性能调优。所以性能优化在面试中出现的频率特别高
楼主自认为自己对性能优化相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。
但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在性能优化方面的知识,只是个小学生水平。
以下,是我总结的一次阿里面试中关于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道大厂面试真题。