JVM 调优经验总结,你遇到过吗?
昨晚,我在路口等车的时候,听到几个程序员在那讨论问题:
“之前我用 jprofiler 监控 jvm 里的对象,当老年代
满了,我手动触发一次 fgc,发现只能回收一半,再触发一次,就完全回收,这种情况正常吗?”
“是不是你的应用正在执行过程中啊?”
“可以考虑下 finalize,弱引用缓存等。”
“那你们怎么确定 CPU 线程上下文切换消耗资源的?你们咋改进的?”
“一般我们的业务系统 CPU 切换消耗很低,你可以试下分批加法,算 100 亿个数字相加什么的,开 10 个,100 个,1000 个,10000 个线程。线程数量太大才会有影响,本质是资源争用,和锁资源有些类似。线程数量要测试,还是要看业务类型,高并发低 CPU 的 Redis 之类影响非常明显,Java 的主要领域是企业业务系统,如果你要实现 Redis,Mongo,MySQL 等基础服务,必须考虑 CPU 切换。”
......
作为一名 Java 从业者,虽然近些年来,无论是使用规模、开发者人数,还是技术生态成熟度、相关工具的丰富程度,Java 都当之无愧是后端开发语言中不可撼动的王者,也是开发各类业务系统的首选语言。
而且薪资也不菲 👇
但我总有种做不动的感觉。项目还好说,让我用 Java 写系统代码都没有问题,但是如果有人问我 Java 程序运行起来以后内部发生了什么,可以怎么让它运行的更好的话,我就真的有点答不上来。
而且我发现,现在面试 Java 岗位,无论什么规模的公司,一般面试官面着面着就会问到 JVM 相关的问题,什么线程、内存模型、JVM 运行时内存、垃圾回收与算法、GC 垃圾收集器、JAVA IO/NIO 、JVM 类加载机制等等知识点。
如果答不好,甚至影响薪酬的多少。
所以了解 JVM 则是深入学习 Java 必不可少的一环,也是 Java 开发人员迈向更高水平的一个阶梯。
我们不仅要会用 Java 写代码做系统,更要懂得如何理解和分析 Java 程序运行起来以后内部发生了什么,然后可以怎么让它运行的更好。
就像我们要想多年开车的老司机,仅仅会开车肯定不能当一个好司机。车开多了,总会有一些多多少少大大小小的故障毛病。老司机需要知道什么现象说明有了什么毛病,需要怎么处理,不然就会导致经常抛锚,影响我们的行程。本专栏的目的就是教会我们怎么去了解 JVM 这辆优秀跑车的一些原理以及怎么去用各种工具分析修理它。
市面上各类 JVM 相关的资料虽多如牛毛,但是明显都很难让大家系统性地学明白,同时一线大厂技术面试现在 JVM 知识也是必考科目。
所以在这个背景下,两位在大厂摸爬滚打 10 多年的 Java 专家全面梳理了系统化学习 JVM 的知识和经验,包括 JVM 调优实战经验、JVM 的技术和内存模型、JVM 参数和内置工具、GC 算法、GC 日志、内存和线程等相关问题排查分析,以及常见的面试问题深度剖析等高级的进阶方法与实战。既满足大家快速系统化学习和全面掌握知识的需求,又兼顾大家的面试经验辅导。
通过体系化的学习,了解一般原理,知其然知其所以然;
熟悉工具和方案,知道从何下手,工作中如何分析和解决问题;
随着课程的演示和练习,加深理解,不管大家之前的基础如何,都能够融会贯通;
面试题的解析部分,会根据大家的反馈进行持续更新,长期助力于大家的学习和进步。
本专栏的特点可以总结为 16 个字:
深入浅出、实践为要、体系完整、层次分明
本专栏分为两部分,基础知识篇主要介绍 JVM 的基础知识、JDK 相关的各种工具用法,深入分析篇讲解各种 GC 算法、如何进行 JVM 的 GC 日志、线程、内存等各类指标进行分析和问题诊断,再结合作者的实际分析调优经验,以及对于常见的 JVM 面试问题进行分析和解答,为学习者梳理清楚 JVM 的整体知识脉络,带来最全面的 JVM 一线经验和实用技巧。
专栏大纲
本次分享您将了解以下内容(22 篇):
基础知识篇
环境准备:千里之行,始于足下
常用性能指标:没有量化,就没有改进
JVM 基础知识:不积跬步,无以至千里
Java 字节码技术:不积细流,无以成江河
JVM 类加载器:山不辞土,故能成其高
JVM 内存模型:海不辞水,故能成其深
JVM 启动参数详解:博观而约取、厚积而薄发
JDK 内置命令行工具:工欲善其事,必先利其器
JDK 内置图形界面工具:海阔凭鱼跃,天高任鸟飞
JDWP 简介:十步杀一人,千里不留行
JMX 与相关工具:山高月小,水落石出
深入分析篇
常见的 GC 算法介绍(Parallel/CMS/G1):温故而知新
Java11 ZGC 和 Java12 Shenandoah 介绍:苟日新、日日新、又日新
Oracle Graalvm 介绍:会当凌绝顶、一览众山小
GC 日志解读与分析:千淘万漉虽辛苦,吹尽狂沙始到金
JVM 的线程堆栈等数据分析:操千曲而后晓声、观千剑而后识器
内存 dump 和内存分析工具:万里赴戎机、关山度若飞
fastthread 相关的工具介绍:欲穷千里目,更上一层楼
面临复杂问题时的几个高级工具:它山之石,可以攻玉
JVM 问题排查分析调优经验:操千曲而后晓声,观千剑而后识器
JVM 相关的常见面试问题汇总:运筹策帷帐之中,决胜于千里之外
应对容器时代面临的挑战:长风破浪会有时、直挂云帆济沧海
专栏亮点
从 0 掌握 JVM 关键技术,了解核心知识;
全面了解各类 GC 算法的原理和特性,洞悉相关原理;
全面学习常见的 JVM 分析调优工具,上手十八般武艺;
一线大厂 JVM 面试题全面剖析,助力拿到心仪 Offer。
你能收获什么
夯实基础:掌握 JVM 的基础知识和常用工具,了解一般原理,知道从什么地方着手分析问题;
深入学习:掌握各类 GC 算法的一般原理,知道如何根据实际需要选择使用合适的 GC 策略;
分析问题:掌握 GC 日志、线程、内存等维度的分析技巧,知道排查问题和优化系统的套路;
积累经验:了解常见的分析调优经验,熟悉常见的面试问题和技巧,彻底学会 JVM 知识。
作者简介
适宜人群
希望提高技术能力的 Java 开发者、运维工程师
对 JVM 技术和性能、问题分析调优感兴趣的技术人员
广大高校计算机和软件专业的师生
点解阅读原文,查看更多试读章节