03JVM
文章平均质量分 95
JVM专栏
CodingW丨编程之路
打造一个懂技术+懂业务+懂管理+略懂英语的社区
→ 高级后端架构师
能够独立负责项目0~1展开到落地
归纳为一句话
目标就是 技术 + 业务 + 管理 + 英语 -> 实现自我价值 -> 带领团队能够开展0~1项目到落地
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
05类加载机制篇(D7_类加载及执行子系统的案例与实战)
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一 大步。原创 2025-03-04 23:47:55 · 1197 阅读 · 2 评论 -
01学习预热篇(D1_Java为什么需要虚拟机?)
大部分脚本语言或者有动态特效的语言都需要一个语言虚拟机运行,比如CPython,Lua,Erlang,Java,Ruby,R,JS,PHP,Perl,Graal 和 C2 最为明显的一个区别是:Graal 是用 Java 写的,而 C2 是用 C++ 写的。APL等等,但是这些语言的虚拟机水平很烂,比如CPython的VM就不忍直视,而HotSpotVM是虚拟机的大神级别,如果能用上。Ahead-of-time compile(提前编译),他在编译期时,会把所有相关的东西,包含一个基底的 VM,一起编译。原创 2024-10-15 16:05:44 · 1136 阅读 · 0 评论 -
01学习预热篇(D2_走进Java虚拟机)
大多数 JDK 都是在 OpenJDK 的基础上编写实现的, 比如IBM J9, Azul Zulu, Azul Zing和Oracle JDK.Oracle JDK之前被称为SUN JDK, 这是在2009年Oracle收购SUN公司之前, 收购后被命名为Oracle JDK。实际上, Oracle JDK是基于OpenJDK源代码构建的, 因此Oracle JDK和OpenJDK之间没有重大的技 术差异。Oracle JDK的商业许可证, 需要联系Oracle的销售人员进行购买。原创 2024-10-15 16:06:53 · 1027 阅读 · 0 评论 -
01学习预热篇(D3_云原生时代的JVM(GraalVM))
阿里云使用GraalVM来加速它们的Java应用程序,并且利用GraalVM的云支持,在云环境中运行它们的应用程。GraalVM的即时编译器采用了新型的JIT技术,能够在运行时对代码进行优化,从而提高应用程序的性能。华为云使用GraalVM作为其云服务的基础设施,从而提高了应用程序的性能和可扩展性。GraalVM的云支持使得它可以在云环境中运行,这意味着开发者可以将应用程序轻松迁移到云上,并且能够。总之,GraalVM是一个非常强大和灵活的工具,可以帮助开发者构建高性能、多语言和云原生的应用程序。原创 2024-10-09 10:44:38 · 1251 阅读 · 0 评论 -
01学习预热篇(D4_基本常识)
getString()方法中的StringBuffer数以函数内部的局部变量,进作用于方法内部,不可能逃逸 出该方法,因此他。但是JVM还存在热度衰减,时间段内调用方法的次数较。我们的JIT是属于动态编译方式的,动态编译(dynamic compilation)指的是“在运行时进行编 译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static。对一般的Java方法而言,编译后代码的大小相对于字节码的大小,膨胀比达到10x是很正常的。原创 2024-10-15 16:08:11 · 886 阅读 · 0 评论 -
01学习预热篇(D5_架构理解)
classic 参数切换),直到 JDK 1.4 的时候, Classic VM 完全退出商用虚拟机的历史舞台,与 Exact VM 一起进。在 JDK 1.3 时, HotSpot VM 成为默认虚拟机, Classic VM 仍作为虚拟机的“备用选择”发布(使用 java-用户能用Java SE的地方自然就不会选择用Java ME,所以市场在快速萎缩。Graal 编译器(JDK 10 加入 HotSpot 的全新即时编译器),由 Java 编写,目标是替代 C2 编译器,C2 历。原创 2024-10-09 10:36:47 · 1107 阅读 · 0 评论 -
01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)
正式踏入JVM深入学习前,我们先简单的走一个流程,通过代码结合JVM的形式,先搭建一套专门学习JVM的项目板块,以便于后续拓展JVM原理的时候,更加方便迭代!原创 2025-01-26 21:37:43 · 1705 阅读 · 0 评论 -
02内存结构篇(D1_自动内存管理)
与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周。方法区是Java虚拟机规范中的定义,是一种规范,而永久代和元空间是 HotSpot 虚拟机不同版本。的上限, 即使不设置也有默认大小,而到了JDK 8,完全废弃了永久代的概念,改用与JRockit、在十年之前(以G1收集器的出现为分界),作为业界绝对主流的HotSpot虚拟机,它内部的垃圾收。对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。原创 2025-01-19 23:45:31 · 1405 阅读 · 0 评论 -
02内存结构篇(D2_剖析运行数据区)
上一节,W哥带大家了解了JVM的内存管理机制,接下来,就让W哥带代价加深对运行时数据区各个结构进一步理解吧。简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体 是由非java语言在外面实现的。原创 2025-01-19 23:52:11 · 1653 阅读 · 0 评论 -
02内存结构篇(D3_对象的创建历程)
运行时数据区了解了,那么我在想,应该再细分下吧,那就是该了解对象的创建历程了!为什么这样的流程呢,因为我们知道内存分配后,自然就要知道创建对象后怎么存放的位置!原创 2025-01-21 00:33:13 · 901 阅读 · 0 评论 -
02内存结构篇(D4_JVM内存分配机制)
被移动到 Survivor 空间中,并将对象年龄设为1。很显然test1方法中的user对象被返回了,这个对象的作用域范围不确定,test2方法中的user对象。如果这个对象覆盖了finalize方法,finalize方法是对象脱逃死亡命运的最后一次机会,如果对象要。survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很。finalize()方法的运行代价高昂, 不确定性大, 无法保证各个对象的调用顺序, 如今已被官方明确。原创 2025-01-21 00:38:24 · 1671 阅读 · 0 评论 -
02内存结构篇(D5_OOM)
在Java开发中,OutOfMemoryError(简称OOM)是常见的内存溢出错误,通常发生在Java虚拟机(JVM)无法分配所需内存时。OOM不仅仅意味着系统内存不足,它还可能由程序中的内存管理问题导致,如内存泄漏或资源未正确释放。本篇博客将全面、深入地分析OOM的产生原因,并给出有效的解决方案。原创 2025-01-21 00:40:32 · 801 阅读 · 0 评论 -
03垃圾回收篇(D1_垃圾收集器算法底层导论)
垃圾收集算法的实现涉及大量的程序细节,且各个平台的虚拟机操作内存的方法都有差异,所以,我们暂不过多讨论算法实现!从如何判定对象消亡的角度出发:垃圾收集算法可以划分为“引用计数式垃圾收集”(ReferenceCountingGC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。以上,从理论原理上介绍了常见的对象存活判定算法和垃圾收集算法,Java虚拟机实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。原创 2025-01-22 00:06:55 · 1425 阅读 · 1 评论 -
03垃圾回收篇(D2_常见垃圾收集器)
经过上一节的介绍,我们已经了解到了垃圾回收机制的基本情况,接下来就让我们一起来看看常见且经典的垃圾收集器!HotSpot虚拟机的垃圾收集器 如图 2.1上图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用,图中收集器所处的区域,则表示它是属于新生代收集器抑或是老年代收集器。除了之前我们所学习的经典垃圾收集器除外,我们还有一些低延迟垃圾收集等!垃圾收集器与内存分配机制(二)原创 2025-01-22 00:52:18 · 1097 阅读 · 0 评论 -
03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
本章主要学习垃圾收集器的选择及相关参数在实际生产环境上应该如何选择垃圾收集器?相关参数如何设置?这里只考虑OpenJDK/OracleJDK的HotSpot虚拟机上的垃圾收集器。没有将Azul和OpenJ9的垃圾收集器加入选择范围,因为不了解。原创 2025-01-23 23:11:01 · 1109 阅读 · 0 评论 -
03垃圾回收篇(D4_彻底理解GC)
JVM 是 Java 程序的虚拟机,是一种实现 Java 语言的解释器。它提供了一种独立于操作系统的运行环境,使得 Java 程序在任何支持 JVM 的计算机上都可以运行。JVM 负责加载、验证、解释、执行和垃圾回收 Java 字节代码,并为 Java 程序提供内存管理、线程管理和安全控制等服务。JVM 中的 GC(Garbage Collection)是垃圾回收的缩写,是 JVM 的内存管理机制。Young GC 和 Full GC 是两种不同的 GC 算法。原创 2025-01-23 23:13:39 · 994 阅读 · 0 评论 -
03垃圾回收篇(D5_垃圾收集器G1&ZGC详解)
ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的垃圾收集器,它曾经停顿时间不超过10ms(JDK16已经达到不超过1ms);停顿时间不会随着堆的大小,或者活跃对象的大小而增加;支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。这么去想,如果使用ZGC来做Java项目,像对STW敏感的证券系统,游戏的系统都可以去用Java来做(以前都是C或者C++的市场),所以ZGC的出现就是为了抢占其他语言的市场(卷!原创 2025-01-26 01:15:25 · 1141 阅读 · 0 评论 -
03垃圾回收篇(D6_GC日志)
在JDK 8中, -verbose:gc 是 -XX:+PrintGC 一个别称,日志格式等价与: -XX:+PrintGC。需要注意这个参数隐 式的设置了参数 -XX:+PrintGC 和 -XX:+PrintGCTimeStamps ,但为了以防。参数 -XX:+PrintGC (或者 -verbose:gc )开启了简单GC日志模式,查 看GC的信息,但是并不直观,可以借助于第三方的GC日志分析工具进行查看。缺省的GC日志时输出到终端的,使用-Xloggc:也可以输出到指定的文件。原创 2025-01-26 01:19:58 · 1217 阅读 · 0 评论 -
04性能监控与调优篇(D1_学习前言)
本章主要通过JVM基础、调优层次、调优指标、何时JVM调优、JVM调优⽬标、JVM调优原则以及JVM调优步骤介绍,以达到对JVM调优有个整体上的认识,后续通过具体的案例结合理论来看下如何进行调优。原创 2025-02-15 22:42:37 · 1165 阅读 · 0 评论 -
04性能监控与调优篇(D2_JVM调优⼯具)
通过上⼀章讲解我们对JVM调优有了整体的认知,接下来我们对在调优过程中所使⽤的⼯具逐⼀介绍。MAT是⼀个强⼤的内存分析⼯具,可以快捷、有效地帮助我们找到内存泄露,减少内存消耗分析⼯ 具。MAT是Memory Analyzer tool的缩写,是⼀种快速,功能丰富的Java堆分析⼯具,能帮助你查找内存泄漏和减少内存消耗。很多情况下,我们需要处理测试提供的hprof⽂件,分析内存相关问题,那么MAT也绝对是不⼆之选。找到最⼤的对象,因为MAT提供显示合理的累积⼤⼩(retained size)原创 2025-02-23 10:31:25 · 1132 阅读 · 0 评论 -
04性能监控与调优篇(D3_JVM参数)
在JVM调整过程中,主要是对JVM参数做的调整,以下我们介绍主要参数。JVM参数有很多,其实我 们直接使⽤默认的JVM参数,不去修改都可以满⾜⼤多数情况。但是如果你想在有限的硬件资源下,部 署的系统达到最⼤的运⾏效率,那么进⾏相关的JVM参数设置是必不可少的。下⾯我们就来对这些JVM参数进⾏详细的介绍。JVM参数主要分为以下三种:标准参数、⾮标准参数、不稳定参数。原创 2025-02-16 20:49:35 · 733 阅读 · 0 评论 -
04性能监控与调优篇(D4_JVM优化)
jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help 检索出所 有的标准参数。用法: java [-options] class [args...] (执行类) 或 java [-options] -jar jarfile [args...](执行 jar 文件)其中选项包括:-d32 使用 32 位数据模型 (如果可用)-d64 使用 64 位数据模型 (如果可用)原创 2025-02-16 20:50:15 · 1074 阅读 · 0 评论 -
04性能监控与调优篇(D5_案例分析)
垃圾收集算法的实现涉及大量的程序细节,且各个平台的虚拟机操作内存的方法都有差异,所以,我们暂不过多讨论算法实现!从如何判定对象消亡的角度出发:垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference CountingGC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。以上,从理论原理上介绍了常见的对象存活判定算法和垃圾收集算法,Java虚拟机实现这些算 法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。原创 2024-10-18 13:35:42 · 1067 阅读 · 0 评论 -
04性能监控与调优篇(D6_调优案例分析与实战)
XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M,达到该值就会触发。2.5)Survivor 0/Survivor 1(S0和S1区):括号内的3.938M表示最大容量,1.188M表示 当前容量,之后的值是当。它包括老年代(图中Old区域)和新生代(图中Eden/S0/S1 三个统称新生代,2.7)Perm Gen(永久代):括号内的256.000M表示最大容量,105.250M表示当前容 量,之后的105.032M表示。原创 2025-02-23 12:10:44 · 1160 阅读 · 0 评论 -
04性能监控与调优篇(D7_JVM调优实战及常量池详解)
/字符串常量池:"计算机"和"技术" 堆内存:str1引用的对象"计算机技术"//堆内存中还有个StringBuilder的对象,但是会被gc回收,StringBuilder的toString方法会new String(),这个String才是真正返回的对象引用String str2 = new StringBuilder("计算机").append("技术").toString();//没有出现"计算机技术"字面量,所以不会在常量池里生成"计算机技术"对象//true。原创 2025-02-19 00:45:50 · 1296 阅读 · 0 评论 -
04性能监控与调优篇(D8_让Java性能提升的JIT深度剖析)
在服务端模式下是 10000 次(我们用的都是服务端,java –version查询),可通过 -XX: CompileThreshold 来设定。Ø 第 2 层:也称为 C1 编译,开启Profiling,仅执行带方法调用次数和循环回边执行次数 profiling 的 C1 编译;在 HotSpot 虚拟机中的热点探测是 JIT 优化的条件,热点探测是基于计数器的热点探测,采用这种方法的虚拟机。Ø 第 1 层:可称为 C1 编译,将字节码编译为本地代码,进行简单、可靠的优化,不开启 Profiling;原创 2025-02-19 00:46:33 · 1042 阅读 · 0 评论 -
05类加载机制篇(D1_类文件结构)
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。我们知道:“计算机只认识0和1,所以我们写的程序需要被编译器翻译成由0和1构成的二进制格式才能被计算机执行。”由于最近十年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展, 把我们编写的程序编译成二进制本地机器码(Native Code)已不再是唯一的选择,越来越多的程序语 言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。原创 2025-03-01 00:58:01 · 1209 阅读 · 0 评论 -
05类加载机制篇(D2_字节码指令(一))
Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands) 而构成。由于Java 虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。由于限制了 Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条。原创 2025-03-01 00:59:44 · 934 阅读 · 0 评论 -
05类加载机制篇(D2_字节码指令(二))
类型转换:i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换) i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)有条件转移:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,操作数栈管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap。astore_1 将引用类型或returnAddress类型值存入局部变量1。原创 2025-03-02 00:20:41 · 1099 阅读 · 0 评论 -
05类加载机制篇(D3_深入理解Class)
JVM会将某个Java 类中所有使用到了的类的完全限定名 以二进制形式的完全限定名 封装成CONSTANT_Class_info结构体中,然后将其放置到常量池里。CONSTANT_Class_info 的 tag 值为 7。其结构如下Tips:类的完全限定名和二进制形式的完全限定名在某个Java源码中,我们会使用很多个类,比如我们定义了一个 ClassTest的类,并把它放到。原创 2025-03-02 00:21:30 · 940 阅读 · 0 评论 -
05类加载机制篇(D4_虚拟机类加载机制)
什么时候开始加载,虚拟机规范并没有强制性的约束,对于其它大部分阶段究竟何时开始虚拟机规范也都没有进行规范,这些都是交由虚拟机的具体实现来把握。所以不同的虚拟机它们开始的时机可能是不 同的。但是对于初始化却严格的规定了有且只有四种情况必须先对类进行“初始化”(加载,验证,准 备自然遇到 new 、 getstatic 、 putstatic 和 invokestatic 这四条指令时,如果对应的类没有初始 化,则要对对应的类先进行初始化。原创 2025-03-04 00:46:47 · 1281 阅读 · 0 评论 -
05类加载机制篇(D5_虚拟机字节码执行引擎)
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一 大步。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机 器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层 面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执 行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。原创 2025-03-04 00:59:30 · 1107 阅读 · 0 评论 -
05类加载机制篇(D6_方法调用和方法执行)
1、Class文件的编译过程中不包含传统编译中的连接步骤,所有方法调用中的目标方法在Class文件里 面都是一个常量池中的符号引用,而不是方法在实际运行时内存布局中的入口地址。2、在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用,这类方法(编译期可知,运行 期不可变)的调用称为解析(Resolution)。主要包括静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自 的。原创 2025-03-04 23:36:55 · 1086 阅读 · 0 评论
分享