我以为对 jvm 性能调优很了解,直到我到阿里面试完之后

相信很多人对于性能调优都不陌生,为了获得更好的系统性能,或者是为了满足不断增加的业务需求。

都需要用到我们的性能调优。所以性能优化在面试中出现的频率特别高

楼主自认为自己对性能优化相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。

但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在性能优化方面的知识,只是个小学生水平。

以下,是我总结的一次阿里面试中关于 jvm 性能优化的面试问题以及知识点。

我以为对 jvm 性能调优很了解,直到我到阿里面试完之后_第1张图片

一、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 性能调优很了解,直到我到阿里面试完之后_第2张图片

三,阿里关于 jvm 性能调优的面试真题:

  • java 类加载过程

  • java 内存分配

  • 描述一下 jvm 加载 class 文件的原理机制?

  • GC 是什么?为什么要有 GC?

  • 如何判断一个对象是否存活?

  • 垃圾回收的优点和原理。并考虑两种回收机制。

  • java 中会存在内存泄漏吗,请简单阐述

  • JVM 的永久带中会发生垃圾回收吗?

  • java 中垃圾收集的方法有哪些

解析不在这里一一给大家展示出来了,为了准备面试收集了很多大厂的面试真题,包括有性能优化,微服务,并发编程,开源框架,分布式等专题。

我以为对 jvm 性能调优很了解,直到我到阿里面试完之后_第3张图片

jvm 性能调优学习笔记:

我以为对 jvm 性能调优很了解,直到我到阿里面试完之后_第4张图片

xmind 思维导图

线程

JVM 内存区域

JVM 运行时内存

垃圾回收与算法

JAVA 四中引用类型

GC 分代收集算法 VS 分区收集算法

GC 垃圾收集器

JAVA IO/NIO

JVM 类加载机制

我以为对 jvm 性能调优很了解,直到我到阿里面试完之后_第5张图片

我以为对 jvm 性能调优很了解,直到我到阿里面试完之后_第6张图片

学习笔记每个 jvm 的知识点都会有详细的分析到,最后,学习笔记,除了 jvm 这个知识点外,还包括了很多知识点,其中包括了有基础知识、Java 集合、多线程并发、spring 原理、微服务、Netty 与 RPC 、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构

最后这里就不多展示了,需要领取这份笔记的同学们

你可能感兴趣的:(面试,性能优化,java)