深入浅出JVM原理及调优
文章平均质量分 92
本系列专题将针对于Oracle Java HotSpot虚拟机为为开发者们提供不同的Java Heap内存空间的较为深入的分析介绍。对于任何接触的开发者都是非常重要的理论依据。频繁遇到的内存问题,提供生产环境的优化调整。那么适当的实战层级的Java虚拟机的内存空间分析能力是至关重要的。
洛神灬殇
前优酷资深工程师,一个具有高洞察力的理性自律小i人 — INTJ,
著作《深入浅出Java虚拟机—JVM原理与实战》,
10年以上开发经验,参与设计过多个大型互联网项目,定期分享技术干货和项目经验,
希望大家可以多多支持我,点赞关注一下
展开
-
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
最近的docker容器经常被kill掉,k8s中该节点的pod也被驱赶。我有一个在主机中运行的Docker容器(也有在同一主机中运行的其他容器)。该Docker容器中的应用程序将会计算数据和流式处理,这可能会消耗大量内存。该容器会不时退出。我怀疑这是由于内存不足,但不是很确定。我需要找到根本原因的方法。那么有什么方法可以知道这个集装箱的死亡发生了什么?原创 2022-12-14 12:12:24 · 6294 阅读 · 0 评论 -
【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(下)
之前文章根据《【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)》我们知道了如何进行设置和控制对应的堆内存和容器内存的之间的关系,所以防止JVM的堆内存超过了容器内存,导致容器出现OOMKilled的情况。但是在整个JVM进程体系而言,不仅仅只包含了Heap堆内存,其实还有其他相关的内存存储空间是需要我们考虑的,一边防止这些内存空间会造成我们的容器内存溢出的场景,正如下图所示。原创 2022-12-01 08:00:00 · 1302 阅读 · 0 评论 -
【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是会被OOMKilled。在此我们介绍一下K8s的OOMKilled的Exit Code编码。原创 2022-11-29 22:36:04 · 1322 阅读 · 0 评论 -
【JVM升级系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究
新、旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript、人工智能之于Python,微服务风潮之于Golang等等。大家都清楚不太可能有哪门语言能在每一个领域都尽占优势,Java已是距离这个目标最接近的选项,但若“天下第一”还要百尺竿头更进一步的话,似乎就只能忘掉Java语言本身,踏入无招胜有招的境界。原创 2022-11-10 18:36:55 · 5682 阅读 · 0 评论 -
【JVM技术专题】针对于Class字节码的文件分析和研究指南 「 进阶篇」
对于理解JVM和深入理解Java语言, 学习并了解class文件的格式都是必须要掌握的功课。 原因很简单, JVM不会理解我们写的Java源文件, 我们必须把Java源文件编译成class文件, 才能被JVM识别, 对于JVM而言, class文件相当于一个接口, 理解了这个接口, 能帮助我们更好的理解JVM的行为;另一方面, class文件以另一种方式重新描述了我们在源文件中要表达的意思, 理解class文件如何重新描述我们编写的源文件, 对于深入理解Java语言和语法都是很有帮助的。原创 2022-10-19 19:21:18 · 4608 阅读 · 0 评论 -
深入剖析JVM的OOM | 内存溢出如何影响JVM运行及应对策略
开发者在处理OutOfMemoryError(OOM)时,需要进行一系列的分析和优化步骤。首先,深入分析错误日志是关键,这有助于确定导致OOM的具体原因。可能的原因包括内存泄漏、不合理的内存分配策略,以及JVM配置不当等。为了应对这些问题,开发者应该采取一系列措施。通过调整堆内存大小、选择合适的垃圾收集器等手段,可以更好地适应应用程序的内存需求,减少OOM的发生。利用缓存技术可以有效减少内存使用,避免创建过多的大型对象也可以降低OOM的风险。原创 2024-03-05 01:30:00 · 1024 阅读 · 0 评论 -
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
本文主要针对于综合层面上进行分析JVM优化方案总结和列举调优参数计划。调优之逃逸分析(栈上分配)调优之线程局部缓存(TLAB)调优之G1回收器线程本地分配缓存,这是一个线程独享的内存分配区域。原创 2024-01-24 13:53:51 · 1123 阅读 · 0 评论 -
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解Java虚拟机的特性和本质
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。Java虚拟机被称为“虚拟”的原因在于它是由一个规范定义的抽象计算机。因此,要运行Java程序,需要一个符合该规范的具体实现。本文主要描述了这个规范本身,同时也针对某些特性做了更细致的描述,包括它们可能的实现方式。原创 2024-01-11 13:51:30 · 964 阅读 · 0 评论 -
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你探索和分析JMM并发模型之(重排序机制)
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。数据依赖关系对于确保程序结果的准确性至关重要,但是在没有数据依赖关系的情况下,编译器和处理器可以对指令重排序以优化性能,并且仍然必须遵循程序的as-if-serial语义。As-if-serial规则确保在单线程环境下,重排序后的指令序列的结果与按顺序执行所有操作的结果一致。这意味着重排序不能改变单线程程序的执行结果。原创 2024-01-10 15:35:01 · 911 阅读 · 1 评论 -
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深入探索类加载机制
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。原创 2024-01-10 15:20:46 · 910 阅读 · 1 评论 -
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。在深入研究线程转储分析和问题模式之前,了解基本原理是至关重要的。为了让你更好地理解,找到下面的图表,显示一个HotSpot VM线程转储及其常见的线程池的可视化分解发现:您可以从HotSpot VM线程转储文件中找到一些信息。根据您的问题模式,其中的一些将比其他的更重要,现在,根据我们的示例Hotspot线程转储,在下面找到每个线程转储部分的详细说明。原创 2023-12-31 14:21:17 · 1023 阅读 · 1 评论 -
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解JMM并发模型的基本原理
通过这样的方式,线程A向线程B发送了一个消息,这个通信过程必须经过主内存来实现。通过控制主内存与每个线程的本地内存之间的交互,Java语言为程序员提供了内存可见性的保证。原创 2023-12-30 23:20:12 · 1237 阅读 · 1 评论 -
作者推荐 |【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(JVM优化篇)
JVM性能优化和调优是Java程序开发中的重要环节。通过合理的内存管理、线程管理和代码优化,可以提高程序的性能和稳定性。在进行优化时,应该根据具体情况选择合适的优化方法,并在保证代码可读性和可维护性的前提下进行优化。全方面带你透彻探索服务优化技术方案。原创 2023-12-17 10:59:42 · 781 阅读 · 0 评论 -
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(底层结构剖析—基本变量概念)
了解Java代码如何编译成字节码并在JVM上执行是非常重要的。这种理解可以帮助我们理解程序执行时发生的情况,确保语言特性符合逻辑,并在进行讨论时能够全面考虑各种因素和副作用。本文将深入探讨Java代码编译成字节码并在JVM上执行的过程。如果您对JVM的内部结构和字节码执行过程中使用的不同内存区域有兴趣,建议阅读我之前的JVM专栏《深入浅出JVM原理及调优》。接下来,我们将介绍不同的Java代码结构,并解释如何将这些结构编译成字节码并在JVM上执行。原创 2023-08-21 15:30:00 · 320 阅读 · 0 评论 -
【JVM技术指南】「GC内存诊断-故障问题排查」一文教你如何打印及分析JVM的GC日志(实战分析上篇)
当我们在开发Java应用程序时,JVM的GC(垃圾回收)是一个非常重要的话题。GC的作用是回收不再使用的内存,以便程序可以继续运行。在JVM中,GC的日志记录了GC的详细信息,包括GC的类型、时间、内存使用情况等。在本文中,我们将介绍JVM GC日志的格式、含义和分析方法。原创 2023-08-08 18:41:20 · 1770 阅读 · 0 评论 -
作者推荐 | 【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(系统服务调优)
为了应对将来的高业务量,目前需要扩容服务器,将2台服务器扩容至4台服务器,然后将服务器由2核4G升级成为4核8G。因此在升级过程中对于参数的调整也存在了一定的迷惑期。原创 2023-08-07 18:56:58 · 263 阅读 · 0 评论 -
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
此章节主要介绍了对于Class字节码文件内部的技术核心结构剖析属性的定义,下一节会对于底层存储结构进行分析说明。敬请期待:《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(底层结构剖析)原创 2023-07-13 20:32:59 · 322 阅读 · 0 评论 -
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(基本结构剖析)
本节将讨论Java class文件的内容,包括常量池的结构和格式等,并详细描述其格式。该章节可作为Java class文件格式的全面参考。此外,通过对应案例分析Java虚拟机完整读取Java class文件的过程,有助于读者更好地理解本章所述内容。原创 2023-07-04 09:30:00 · 2044 阅读 · 0 评论 -
【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系
线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存, 本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念, 并不真实存在。它涵盖了缓存, 写缓冲区, 寄存器以及其他的硬件和编译器优化。Java 内存模型的抽象示意图如下:线程A把本地内存A中更新过的共享变量刷新到主内存中去。线程B到主内存中去读取线程A之前已更新过的共享变量。下面通过示意图来说明这两个步骤:如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。原创 2023-03-26 21:43:17 · 3648 阅读 · 1 评论 -
官方文档 | 【JVM调优体系】「GC底层调优实战」XPocket为终结性能问题而生 — 可以试试看
探索JVM的运行时数据,强大的JVM运行时状态分析工具(注:由于jdk8以上开始实施模块化,导致HSDB与其的运行机制不兼容)。Java调试器(JDB)是Java类在命令行中调试程序的工具, 它实现了Java平台调试器体系结构, 它有助于使用Java调试接口(JDI)检测和修复Java程序中的错误。Perf功能强大,它可以检测CPU性能计数器,跟踪点,kprobes和uprobes(动态跟踪),它能够进行轻量级分析。它也包含在Linux内核的tools / perf下,并且经常更新和增强,原创 2023-03-30 13:27:15 · 3824 阅读 · 1 评论 -
精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴痛点,我写了本篇文章,希望可以帮助大家夯实基础和锻造JVM技术功底。在JVM领域中GC(Garbage Collection)翻译为 “垃圾收集“,Garbage Collector翻译为 “垃圾收集器”。原创 2023-01-23 16:40:20 · 6177 阅读 · 0 评论 -
【Java应用服务体系】「序章入门」全方位盘点和总结调优技术专题指南
调优手段就是让计算机的硬件或软件在正常地⼯作基础上,非常出色的发挥其应有的性能,并且将所承担的负担降低到最低的技术手段。在Java应用服务体系中有大致可以分为5个维度的调优方向。IDLE 对象在队列中,并空闲。ALLOCATED 使⽤中(即出借中)EVICTION 对象当在队列中,正在进⾏驱逐测试EVICTION_RETURN_TO_HEAD 对象驱逐测试通过后,放回到队列头部VALIDATION 对象当前在队列中,空闲校验中。原创 2023-01-21 00:00:51 · 597 阅读 · 1 评论 -
【JVM故障问题排查心得】「虚拟机线程问题」实战分析JVM线程导致CPU过载过高的问题排查方案
(服务调优或问题排查执行方案)本次主要分析一下相关的线上如果出现CPU负载过高的情况下,应该如何按照步骤去排查和分析问题,接下来就让我们一同迈入优化和解决问题的探索之路。原创 2023-01-05 22:47:12 · 522 阅读 · 1 评论 -
【JVM故障问题排查心得】「内存优化技术」Java虚拟机内存优化实战案例分析指南
在开始前,我们需要一些数据,因为jvm调优没有一个标准的答案,根据实际应用不同而不同,但也不是完全没有章法可言,从一个实际的应用,我们也可以找出一些规律来,找出一些比较公用的,比如下面三条:使用 参数:可以查看当前版本的虚拟机所能设置的所有参数,还可以看到其默认值。我使用6u26版本的java虚拟机,一共有663个参数,很多参数不必完全搞懂什么意思,而且很多优化项在JDK6版本中已经默认开启,所以我们只需要了解一些常用的即可。在单机web server的情况下,最大堆的设置建议在物理内原创 2023-01-05 22:38:42 · 4842 阅读 · 1 评论 -
【JVM故障问题排查心得】「线程诊断系列」通过jstack线程状态分析虚拟机线程问题指南
学习研究thread dump文件是一种很不错的能力哦,因为它可以帮助我们在危急关头去解决和分析问题,接下来,就让我们开始分析和研究一下jstack dump文件吧。原创 2023-01-04 21:08:28 · 1409 阅读 · 1 评论 -
【分布式技术专题】「系统服务优化系列」Web应用服务的性能指标优化开发指南(JVM篇)
hotspot jvm 内置了两个jit编译器,分别是client compiler(C1编译器)和server compiler(C2编译器),可通过下列指令显式指定使用哪种即时编译器。计数器有两种:方法调用计数器和方法里的循环回边计数器,一个方法是否达到编译阈值取决于方法中的两种计数器之和。如果内存分配过大或过小,或者采用的 GC 收集器比较慢,则应该优先调整这些参数,并且先找 1 台或几台机器进行 beta,然后比较优化过的机器和没有优化的机器的性能对比,并有针对性的做出最后选择;通过不断的试验和试原创 2023-01-04 21:05:57 · 581 阅读 · 1 评论 -
【JVM故障问题排查心得】「内存诊断系列」Xmx和Xms的大小是小于Docker容器以及Pod的大小的,为啥还是会出现OOMKilled?
做ygc的时候会将新生代里的不可达的DirectByteBuffer对象及其堆外内存回收了,但是无法对old里的DirectByteBuffer对象及其堆外内存进行回收,这也是我们通常碰到的最大的问题,如果有大量的DirectByteBuffer对象移到了old,但是又一直没有做cms gc或者full gc,而只进行ygc,那么我们的物理内存可能被慢慢耗光,但是我们还不知道发生了什么,因为heap明明剩余的内存还很多(前提是我们禁用了System.gc)。针对于直接内存的核心类就在, 在。原创 2022-12-31 22:48:21 · 1123 阅读 · 3 评论 -
【JVM技术专题】「原理专题」深入分析Java中finalize方法的作用和底层原理
执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。若JVM检测到finalized状态的对象变成unreachable,回收其内存(I),若对象并未覆盖finalize方法,JVM会进行优化,直接回收对象(O)大致描述一下finalize的运行流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。在Java中含有一些一些与finalize相关的方法,由于一些致命的缺陷,已经被废弃了,如。原创 2022-12-29 02:00:00 · 557 阅读 · 0 评论 -
【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康
相信如果经历了我的上一篇Arthas的文章[【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南]之后,相信你对Arthas的功能和使用应该有了一定的理解了。那么我们就要进行下一步的探索功能。在容器化部署的环境内部,Java进程可以是在不同的机器启动的,想要使用Arthas去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个Java进程。在这种情况下,可以使用 Arthas Tunnel Server/Client。原创 2022-12-21 23:38:35 · 2021 阅读 · 0 评论 -
深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的“标准参数“的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」
搞清楚了上面这些组合,我们再来看看各类GC算法的触发条件。简单说,触发条件就是某GC算法对应区域满了,或是预测快满了。比如,各种Young GC的触发原因都是eden区满了;Serial Old GC/PS MarkSweep GC/Parallel Old GC的触发则是在要执行Young GC时候预测其promote的object的总size超过老生代剩余size;CMS GC的initial marking的触发条件是老生代使用比率超过某值;原创 2022-12-15 20:33:08 · 727 阅读 · 0 评论 -
【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南
Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。原创 2022-12-13 12:24:22 · 896 阅读 · 1 评论 -
【JVM技术专题】「原理专题」全流程分析Java对象的创建过程及内存布局
java中对象的创建方式有很多种,常见的是通过new关键字和反射这两种方式来创建。除此之外,还有clone、反序列化等方式创建。原创 2022-11-26 17:19:38 · 1115 阅读 · 0 评论 -
【JVM技术专题】「原理专题」深入剖析Java对象内存分配及跨代引用分析
本文主要介绍的内容为:Java对象内存的分配规则和针对于JVM内存布局之间不同区域的对象引用关系(跨代引用很容易属于大家的盲点),相关Java对象分配内存的规则以及顺序,首先我们先从JVM的内存布局和结构进行认识了解。原创 2022-11-26 17:15:08 · 251 阅读 · 0 评论 -
【Java综合专栏】「引领序幕」全链路追踪原理之Java Agent探针的技术介绍(上篇)
Java Agent 直译过来叫做 Java 代理,还有另一种称呼叫做 Java 探针。首先说 Java Agent 是一个 jar 包,只不过这个 jar 包不能独立运行,它需要依附到我们的目标 JVM 进程中。我们来理解一下这两种叫法。原创 2022-11-24 12:55:09 · 5344 阅读 · 1 评论 -
精华推荐 |【JVM技术专题】深入学习JIT编译器实现机制「核心剖析篇」
我们都知道开发语言整体分为两类,一类是编译型语言,一类是解释型语言。那么你知道二者有何区别吗?编译器和解释器又有什么区别?这是为了兼顾启动效率和运行效率两个方面。Java程序最初是通过解释器进行解释运行的,当虚拟机返现某个方法或代码块的运行特别频繁时,就会把这段代码标记为热点代码,为了提供热点代码的运行效率,在运行时,虚拟机就会把这些代码编译成与本地平台相关的机器码。并进行各种层次的优化。原创 2022-11-23 15:59:15 · 681 阅读 · 0 评论 -
【JVM技术专题】「源码专题」深入剖析JVM的Mutex锁的运行原理及源码实现(底层原理-防面试)
并行编程之条件变量(posix condition variables)在整理Java LockSupport.park()的东东,看到了个"Spurious wakeup",重新梳理下。原创 2022-11-22 13:04:23 · 839 阅读 · 0 评论 -
【JVM技术系列】「逆向ClassLoader加载机制」认识一下线程上下文类加载器实现
线程上下文类加载,就是当前线程所拥有的类加载器,可通过 Thread.currentThread() 获取当前线程。线程上下文类加载器(Thread Context ClassLoader)可以通过java.lang.Thread类的setContextClassLoader()方法设置,创建线程时候未指定的话,则默认从父线程中继承(系统类加载器)。main方法的主线程上下文类加载器就是sun.misc.Launcher$AppClassLoader原创 2022-11-13 14:48:28 · 424 阅读 · 0 评论 -
【JVM翻译系列】「官方技术翻译」《A FIRST LOOK INTO ZGC》初探JVM-ZGC垃圾回收器
ZGC是一个新兴的垃圾回收器,刚刚被Oracle官方在OpenJDK的方式进行开源传播,它主要是被Per Liden进行开发完成的。原创 2022-11-10 12:35:48 · 627 阅读 · 0 评论 -
【JVM原理系列】「GC本质底层机制」SafePoint的深入分析和底层原理探究指南
在高度优化的现代JVM里,Safepoint有几种不同的用法。GC safepoint是最常见、大家听说得最多的,但还有deoptimization safepoint也很重要。原创 2022-11-10 12:33:48 · 402 阅读 · 0 评论 -
【JVM技术专题】垃圾回收认知和调优的“思南(司南)“「下篇」
并行收集器(也称为吞吐量收集器)是类似于串行收集器的分代收集器。 串行和并行收集器之间的主要区别是,并行收集器有多个线程,用于加速垃圾回收。原创 2022-11-10 12:24:29 · 451 阅读 · 0 评论