JVM 核心技术 32 讲
文章平均质量分 92
最实用的JVM基础与问题分析技术:
- 通过体系化的学习,了解一般原理,知其然知其所以然;
- 熟悉工具和方案,知道从何下手,工作中如何分析和解决问题;
- 随着课程的演示和练习,加深理解,不管大家之前的基础如何,都能够融会贯通;
- 面试题的解析部分,长期助力于大家的学习和进步。
余额抵扣
助学金抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
kimmking
秦金卫(KimmKing),Apache Dubbo/ShardingSphere PMC,前某集团高级技术总监/阿里架构师/某商业银行北京研发中心负责人,阿里云MVP、腾讯TVP、TGO鲲鹏会会员、1024学院CTO培训班第六届学员。关注于互联网,电商,金融,支付,区块链等领域,熟悉海量并发低延迟交易系统的设计实现,10多年研发管理和架构经验,熟悉各类中间件,擅长于SOA/微服务等分布式系统架构。《微服务架构实战:基于Dubbo、Spring Cloud和Service Mesh》、《JVM核心技术32讲》合著作者。http://kimmking.github.io
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
不同GC下ParallelGCThreads和ConcGCThreads的计算公式
目录计算公式结论Parallel GC下验证CMS GC下验证G1 GC下验证前面的文章(JVM认知的常见10个误区 - kimmking的文章 - 知乎JVM认知的常见10个误区 - 知乎)里,我们提到了CMS下的这两个参数的关系。其实我们可以全面的看一下Parallel/CMS/G1 GC下的这个关系。计算公式结论这里先总结一下,具体的验证过程见下面的步骤:三种GC下,ParallelGCThreads默认值都是CPU线程数(想想为什么?) 并行Parallel GC.原创 2021-11-25 21:35:07 · 1971 阅读 · 0 评论 -
JVM认知的常见10个误区
目录1、OpenJDK8的默认GC是不是CMS/G1?2、默认最大堆内存是不是物理内存的1/4?3、默认的年轻代最大值是不是一定是堆内存的1/3?4、给JVM分配内存越多越好吗?5、堆外内存很小,所以不用管?6、所有的GC都会暂停(Stop The World)吗?7、并发线程是CPU的1/8,并行线程是CPU的5/8吗?8、是不是GC停顿越短系统性能就越好?9、G1会不会发生长时间停顿的Full GC?10、ZGC到底比G1/CMS/ParallelGC好在哪儿..原创 2021-11-25 19:07:03 · 1109 阅读 · 0 评论 -
我想对读者说的话
课程背景近些年来,无论是使用规模、开发者人数,还是技术生态成熟度、相关工具的丰富程度,Java 都当之无愧是后端开发语言中不可撼动的王者,也是开发各类业务系统的首选语言。时至今日,整个 IT 招聘市场上,Java 开发工程师依然是缺口最大,需求最多的热门职位。另外,从整个市场环境看,传统企业的信息化,传统 IT 系统的互联网化,都还有非常大的发展空间,由此推断未来 Java 开发的市场前景广阔...原创 2020-09-22 12:07:19 · 1766 阅读 · 0 评论 -
环境准备:千里之行,始于足下
Java 语言编写代码非常简单,也很容易入门,非常适合开发各种企业级应用和业务系统。一个众所周知的事实是: 用起来越简单的系统, 其背后的原理和实现就越复杂。道理很容易理解, 系统的内部实现考虑了各种极端的情况,对用户屏蔽了各种复杂性。作为支撑庞大的 Java 生态系统的基石, JVM 内部实现是非常复杂的。据统计,OpenJDK 的实现代码已经超过 1000 万行。JVM 难不难? 自然是 “...原创 2020-09-22 12:07:17 · 1103 阅读 · 0 评论 -
常用性能指标:没有量化,就没有改进
前面一节课阐述了 JDK 的发展过程,以及怎么安装一个 JDK,在正式开始进行 JVM 的内容之前,我们先了解一下性能相关的一些基本概念和原则。如果要问目前最火热的 JVM 知识是什么? 很多同学的答案可能是 “JVM 调优” 或者 “JVM 性能优化”。但是具体需要从哪儿入手,怎么去做呢?其实“调优”是一个诊断和处理手段,我们最终的目标是让系统的处理能力,也就是“性能”达到最优化,...原创 2020-09-22 12:07:16 · 1030 阅读 · 0 评论 -
JVM 基础知识:不积跬步,无以至千里
前面的章节我们介绍了 JDK 和 JVM 的关系以及环境准备等,本节我们来探讨一下 JVM 的基础知识,包括以下内容:常见的编程语言类型关于跨平台、运行时(Runtime)与虚拟机(VM)关于内存管理和垃圾回收(GC)3.1 常见的编程语言类型我们都知道 Java 是一种基于虚拟机的静态类型编译语言。那么常见的语言可以怎么分类呢?1)编程语言分类首先,我们可以把形形色色的编程从底...原创 2020-09-22 12:07:14 · 1114 阅读 · 0 评论 -
Java 字节码技术:不积细流,无以成江河
Java 中的字节码,英文名为 bytecode, 是 Java 代码编译后的中间代码格式。JVM 需要读取并解析字节码才能执行相应的任务。从技术人员的角度看,Java 字节码是 JVM 的指令集。JVM 加载字节码格式的 class 文件,校验之后通过 JIT 编译器转换为本地机器代码执行。 简单说字节码就是我们编写的 Java 应用程序大厦的每一块砖,如果没有字节码的支撑,大家编写的代码也就...原创 2020-09-22 12:07:13 · 810 阅读 · 0 评论 -
Java 类加载器:山不辞土,故能成其高
前面我们学习了 Java 字节码,写好的代码经过编译变成了字节码,并且可以打包成 Jar 文件。然后就可以让 JVM 去加载需要的字节码,变成持久代/元数据区上的 Class 对象,接着才会执行我们的程序逻辑。我们可以用 Java 命令指定主启动类,或者是 Jar 包,通过约定好的机制,JVM 就会自动去加载对应的字节码(可能是 class 文件,也可能是 Jar 包)。我们知道 Jar 包...原创 2020-09-22 12:07:11 · 746 阅读 · 0 评论 -
Java 内存模型:海不辞水,故能成其深
了解计算机历史的同学应该知道,计算机刚刚发明的时候,是没有内存这个概念的,速度慢到无法忍受。 直到冯诺依曼提出了一个天才的设计才解决了这个问题,没错,这个设计就是加了内存,所以现代的电子计算机又叫做“冯诺依曼机”。JVM 是一个完整的计算机模型,所以自然就需要有对应的内存模型,这个模型被称为 “Java 内存模型”,对应的英文是“Java Memory Model”,简称 JMM。Java 内...原创 2020-09-22 12:07:09 · 746 阅读 · 0 评论 -
JVM 启动参数详解:博观而约取、厚积而薄发
JVM 作为一个通用的虚拟机,我们可以通过启动 Java 命令时指定不同的 JVM 参数,让 JVM 调整自己的运行状态和行为,内存管理和垃圾回收的 GC 算法,添加和处理调试和诊断信息等等。本节概括的讲讲 JVM 参数,对于 GC 相关的详细参与将在后续的 GC 章节说明和分析。直接通过命令行启动 Java 程序的格式为:java [options] classname [args]ja...原创 2020-09-22 12:07:08 · 1411 阅读 · 0 评论 -
JDK 内置命令行工具:工欲善其事,必先利其器
很多情况下,JVM 运行环境中并没有趁手的工具,所以掌握基本的内置工具是一项基本功。JDK 自带的工具和程序可以分为 2 大类型:开发工具诊断分析工具JDK 内置的开发工具写过 Java 程序的同学,对 JDK 中的开发工具应该比较熟悉。下面列举常用的部分:工具简介javaJava 应用的启动程序javacJDK 内置的编译工具javap反编译...原创 2020-09-22 12:07:06 · 835 阅读 · 0 评论 -
JDK 内置图形界面工具:海阔凭鱼跃,天高任鸟飞
GUI 图形界面工具,主要是 3 款:JConsole、JVisualVM、JMC。其实这三个产品可以说是 3 代不同的 JVM 分析工具。这三个工具都支持我们分析本地 JVM 进程,或者通过 JMX 等方式连接到远程 JVM 进程。当然,图形界面工具的版本号和目标 JVM 不能差别太大,否则可能会报错。下面分别对它们进行介绍。JConsoleJConsole,顾名思义,就是“Java 控...原创 2020-09-22 12:07:04 · 1190 阅读 · 0 评论 -
JDWP 简介:十步杀一人,千里不留行
Java 平台调试体系(Java Platform Debugger Architecture,JPDA),由三个相对独立的层次共同组成。这三个层次由低到高分别是 Java 虚拟机工具接口(JVMTI)、Java 调试连接协议(JDWP)以及 Java 调试接口(JDI)。模块层次编程语言作用JVMTI底层C获取及控制当前虚拟机状态JDWP中间层C定义 J...原创 2020-09-22 12:07:03 · 959 阅读 · 0 评论 -
JMX 与相关工具:山高月小,水落石出
Java 平台提供了全面的 JVM 监控和管理措施。在 Java SE 5 之前,虽然 JVM 提供了一些底层的 API,比如 JVMPI 和 JVMTI,但这些 API 都是面向 C 语言的,需要通过 JNI 等方式才能调用,想要监控 JVM 和系统资源非常不方便。Java SE 5.0 版本引入了 JMX 技术(Java Management Extensions,Java 管理扩展),J...原创 2020-09-22 12:07:01 · 661 阅读 · 0 评论 -
常见的 GC 算法介绍(Parallel/CMS/G1):温故而知新
GC 是英文词汇 Garbage Collection 的缩写,中文一般直译为“垃圾收集”。当然有时候为了让文字更流畅,也会说“垃圾回收”。一般认为“垃圾回收”和“垃圾收集”是同样的意思。此外,GC 也有“垃圾收集器”的意思,英文表述为 Garbage Collector。本节我们就来详细讲解常用的 GC 算法。闲话 GC假如我们做生意,需要仓库来存放物资。如果所有仓库都需要公司自建,那成本...原创 2020-09-22 12:06:59 · 1959 阅读 · 0 评论 -
常见的 GC 算法(Parallel/CMS/G1)
学习了 GC 算法的相关概念之后,我们将介绍在 JVM 中这些算法的具体实现。首先要记住的是,大多数 JVM 都需要使用两种不同的 GC 算法——一种用来清理年轻代,另一种用来清理老年代。我们可以选择 JVM 内置的各种算法。如果不通过参数明确指定垃圾收集算法,则会使用相应 JDK 版本的默认实现。本章会详细介绍各种算法的实现原理。串行 GC(Serial GC)串行 GC 对年轻代使用 m...原创 2020-09-22 12:06:57 · 2451 阅读 · 0 评论 -
Java11 ZGC 和 Java12 Shenandoah 介绍:苟日新、日日新、又日新
随着互联网的迅速发展和计算机硬件的迭代更新,越来越多的业务系统使用大内存。 而且这些实时在线业务对响应时间比较敏感。比如需要实时获得响应消息的支付业务,如果JVM的某一次GC暂停时间达到10秒,显然会让客户的耐心耗尽。还有一些对延迟特别敏感的系统,一般要求响应时间在100ms以内。 例如高频交易系统,业务本身就有一些运算耗时,如果GC暂停时间超过一半(>50ms),那很可能就会让某些交易策...原创 2020-09-22 12:06:56 · 963 阅读 · 0 评论 -
Oracle GraalVM 介绍:会当凌绝顶、一览众山小
GraalVM 简介与特性前面了解了那么多的 JVM 相关技术,我们可以发现一个脉络就是 Java 相关的体系越来越复杂,越来越强大。放眼看去,最近十年来,各种各类的技术和平台层出不穷,每类技术都有自己的适用场景和使用人群。并且伴随着微服务和云原生等理念的出现和发展,越来越多的技术被整合到一起。那么作为目前最流行的平台技术,Java/JVM 也自然不会在这个大潮中置身事外。本节我们介绍一个语言...原创 2020-09-22 12:06:54 · 1388 阅读 · 0 评论 -
GC 日志解读与分析:千淘万漉虽辛苦,吹尽狂沙始到金
本章通过具体示例来演示如何输出 GC 日志,并对输出的日志信息进行解读分析,从中提取有用的信息。本次演示的示例代码为了演示需要,我们先来编写一段简单的 Java 代码:package demo.jvm0204;import java.util.Random;import java.util.concurrent.TimeUnit;import java.util.concurrent....原创 2020-09-22 12:06:53 · 624 阅读 · 0 评论 -
JVM 的线程堆栈等数据分析:操千曲而后晓声、观千剑而后识器
Java 线程简介与示例多线程的使用和调优也是 Java 应用程序性能的一个重要组成部分,本节我们主要来讨论这一部分内容。线程(Thread)是系统内核级的重要资源,并不能无限制地创建和使用。创建线程的开销很大,由于线程管理较为复杂,在编写多线程代码时,如果有哪里未设置正确,可能会产生一些莫名其妙的 Bug。开发中一般会使用资源池模式,也就是“线程池”(Thread Pool)。通过把线程的...原创 2020-09-22 12:06:51 · 552 阅读 · 0 评论 -
GC 日志解读与分析(实例分析上篇)
上一节讲述了 GC 日志相关的基础信息和配置。需要提醒的是,这些参数是基于 JDK 8 配置的。在 JDK 9 之后的版本中,启动参数有一些变化,继续使用原来的参数配置可能会在启动时报错。不过也不用担心,如果碰到,一般都可以从错误提示中找到对应的处置措施和解决方案。例如 JDK 11 版本中打印 info 级别 GC 日志的启动脚本:# JDK 11 环境,输出 info 级别的 GC 日...原创 2020-09-22 12:06:50 · 1163 阅读 · 0 评论 -
内存分析与相关工具上篇(内存布局与分析工具)
通过前面的课程,我们学习了“内存溢出”和“内存泄漏”的区别。简单来说,Java 中的内存溢出就是内存不够用,一般是堆内存报错,当然也可能是其他内存空间不足引起的。下面我们详细讲解 Java 对象的内存相关知识。Java 对象内存布局简介 请思考一个问题: 一个对象具有 100 个属性,与 100 个对象每个具有 1 个属性,哪个占用的内存空间更大?为了回答这个问题,我们来看看 JV...原创 2020-09-22 12:06:48 · 543 阅读 · 0 评论 -
GC日志解读与分析(实例分析中篇)
CMS 的 GC 日志解读CMS 也可称为“并发标记清除垃圾收集器”。其设计目标是避免在老年代 GC 时出现长时间的卡顿。默认情况下,CMS 使用的并发线程数等于 CPU 内核数的 1/4。通过以下选项来指定 CMS 垃圾收集器:-XX:+UseConcMarkSweepGC如果 CPU 资源受限,CMS 的吞吐量会比并行 GC 差一些。示例:# 请注意命令行启动时没有换行,此处是方便...原创 2020-09-22 12:06:46 · 486 阅读 · 0 评论 -
FastThread 相关的工具介绍:欲穷千里目,更上一层楼
FastThread 简介在前面的章节里,我们知道了可以打印出来 JVM 的所有线程信息,然后进行分析。然而所有的线程信息都很长,看起来又差不多,每次去看都让人头大。所以,每当我去分析线程都在想,要是有工具能帮我把一般情况汇总,并自动帮我分析分析 JVM 线程情况就好了。这里要介绍的 FastThread 就是这么一款工具。 FastThread 是一款线程转储(Thread Dump)...原创 2020-09-22 12:06:45 · 5192 阅读 · 0 评论 -
GC 日志解读与分析(实例分析下篇)
复习一下:G1 的全称是 Garbage-First,意为垃圾优先,哪一块的垃圾最多就优先清理它。G1 相关的调优参数,可以参考: https://www.oracle.com/technical-resources/articles/java/g1gc.htmlG1 使用示例:# 请注意命令行启动时没有换行java -XX:+UseG1GC-Xms512m-Xmx512m-...原创 2020-09-22 12:06:43 · 455 阅读 · 0 评论 -
面临复杂问题时的几个高级工具:它山之石,可以攻玉
前面提到了很多 JVM 的分析工具,本节里我们会再介绍几种有用的工具,大家可以在需要的时候按需使用。OOM Killer在前面的章节,我们简单提及过 Linux 系统上的 OOM Killer(Out Of Memory killer,OOM 终结者)。假如物理内存不足,Linux 会找出“一头比较壮的进程”来杀掉。OOM Killer 参数调优Java 的堆内存溢出(OOM),是指堆内存...原创 2020-09-22 12:06:42 · 682 阅读 · 0 评论 -
JVM 问题排查分析下篇(案例实战)
GC 问题排查实战案例这一部分,我们来看一个实际的案例。假设我们有一个提供高并发请求的服务,系统使用 Spring Boot 框架,指标采集使用 MicroMeter,监控数据上报给 Datadog 服务。当然,Micrometer支 持将数据上报给各种监控系统,例如:AppOptics、Atlas、Datadog、Dynatrace、Elastic、Ganglia、Graphite、Hum...原创 2020-09-22 12:06:40 · 692 阅读 · 0 评论 -
GC 日志解读与分析(番外篇可视化工具)
通过前面的学习,我们发现 GC 日志量很大,人工分析太消耗精力了。由于各种 GC 算法的复杂性,它们的日志格式互相之间不太兼容。有没有什么工具来减少我们的重复劳动呢? 这种轮子肯定是有现成的。比如 GCEasy、GCViwer 等等。这一节我们就开始介绍一些能让我们事半功倍的工具。GCEasy 工具GCEasy 工具由 Tier1app 公司 开发和支持,这家公司主要提供3款分析工具:...原创 2020-09-22 12:06:39 · 591 阅读 · 0 评论 -
JVM 问题排查分析上篇(调优经验)
一般来说,只要系统架构设计得比较合理,大部分情况下系统都能正常运行,出现系统崩溃等故障问题是小概率事件。也就是说,业务开发是大部分软件工程中的重头戏,所以有人开玩笑说:“面试造火箭,入职拧螺丝。”一般来说,我们进行排查分析的目的主要有:解决问题和故障排查系统风险隐患我们按照问题的复杂程度,可以分为两类:常规问题疑难杂症常规的问题一般在开发过程中就被发现和解决了,所以线上问题一...原创 2020-09-22 12:06:37 · 795 阅读 · 0 评论 -
应对容器时代面临的挑战:长风破浪会有时、直挂云帆济沧海
当今的时代,容器的使用越来越普及,Cgroups、Docker、Kubernetes 等项目和技术越来越成熟,成为很多大规模集群的基石。容器是一种沙盒技术,可以对资源进行调度分配和限制配额、对不同应用进行环境隔离。容器时代不仅给我们带来的机遇,也带来了很多挑战。跨得过去就是机会,跳不过去就是坑。在容器环境下,要直接进行调试并不容易,我们更多地是进行应用性能指标的采集和监控,并构建预警机制。而...原创 2020-09-22 12:06:36 · 665 阅读 · 0 评论 -
内存分析与相关工具下篇(常见问题分析)
Java 程序的内存可以分为几个部分:堆(Heap space)、非堆(Non-Heap)、栈(Stack)等等,如下图所示:最常见的 java.lang.OutOfMemoryError 可以归为以下类型。OutOfMemoryError: Java heap spaceJVM 限制了 Java 程序的最大内存使用量,由 JVM 的启动参数决定。其中,堆内存的最大值,由 JVM 启动参...原创 2020-09-22 12:06:34 · 610 阅读 · 0 评论 -
GC 疑难情况问题排查与分析(上篇)
本章介绍导致 GC 性能问题的典型情况。相关示例都来源于生产环境,为演示需要做了一定程度的精简。 名词说明:Allocation Rate,翻译为“分配速率”,而不是分配率。因为不是百分比,而是单位时间内分配的量。同理,Promotion Rate 翻译为“提升速率”。高分配速率(High Allocation Rate)分配速率(Allocation Rate)表示单位时间内分配的内...原创 2020-09-22 12:06:33 · 641 阅读 · 0 评论 -
GC 疑难情况问题排查与分析(下篇)
Weak、Soft 及 Phantom 引用另一类影响 GC 的问题是程序中的 non-strong 引用。虽然这类引用在很多情况下可以避免出现 OutOfMemoryError,但过量使用也会对 GC 造成严重的影响,反而降低系统性能。弱引用的缺点首先,弱引用(weak reference)是可以被 GC 强制回收的。当垃圾收集器发现一个弱可达对象(weakly reachable,即指向...原创 2020-09-22 12:06:31 · 535 阅读 · 0 评论 -
JVM 相关的常见面试问题汇总:运筹策帷帐之中,决胜于千里之外
面试和笔试的要点其实差不多,基础知识和实战经验都是最重要的关注点(当然,面试时的态度和眼缘也很重要)。实际面试时,因为时间有限,不可能所有问题都问一遍,一般是根据简历上涉及的内容,抽一部分话题来聊一聊。看看面试者的经验、态度,以及面对一层层深入问题时的处理思路。借此了解面试者的技术水平,对深度、广度,以及思考和解决问题的能力。常见的面试套路是什么呢?XXX 是什么?实现原理是什么?为什...原创 2020-09-22 12:06:29 · 831 阅读 · 0 评论
分享