- 博客(15)
- 收藏
- 关注
原创 JVM学习日记(十五)Day15——性能监控与调优(二)
本文介绍了几个常用的Java命令行监控工具:jhat用于分析堆转储文件,提供Web界面查看结果(JDK9已移除);jstack用于生成线程快照,可诊断死锁和高CPU占用问题;jcmd是多功能工具,可替代大部分监控命令;jstatd则提供远程监控能力。这些工具各有侧重,jhat和jstack适合具体问题分析,jcmd功能全面但较复杂,jstatd因安全风险较少使用。文章建议初学者优先尝试jstat和jmap,后续可转向GUI工具如VisualVM进行更直观的分析。
2025-08-03 11:20:46
736
原创 JVM学习日记(十四)Day14——性能监控与调优(一)
本文介绍了JVM性能调优的三个关键步骤:发现问题、排查问题和解决问题。通过jps、jstat、jinfo和jmap等JVM工具,可以监控内存使用、GC情况、查看堆转储文件等。重点讲解了如何生成和分析heap dump文件,以及如何通过命令行工具实时监控JVM状态。文章还提供了常用的JVM参数配置建议,如设置HeapDump参数以便在OOM时自动生成内存快照。这些工具和技巧帮助开发者快速定位内存泄漏、GC问题和性能瓶颈,实现有效的JVM调优。
2025-08-02 09:45:12
1162
原创 JVM学习日记(十三)Day13
文章摘要: 本文主要讲解了Java类的使用方式和生命周期管理。在类的使用方面,分为主动使用(触发初始化)和被动使用(不触发初始化)两种情况,详细列举了各种场景下的类加载行为。在类的生命周期部分,探讨了类的卸载条件和GC触发机制,包括堆内存不足和元空间不足时的GC处理。最后介绍了自定义类加载器的实现方式,包括继承ClassLoader类、重写findClass方法以及破除双亲委派机制的方法。全文涵盖从类加载到卸载的完整过程,并提供了具体实现思路。
2025-08-01 10:20:41
825
原创 JVM学习日记(十二)Day12
本文深入解析JVM字节码文件结构及指令集。首先介绍了识别字节码文件的魔数CAFEBABE,解释了字节码本质是二进制流,可通过多种方式加载。详细说明了Class文件结构,包括常量池、字段方法等组成部分。重点剖析了9大类字节码指令:常量加载、局部变量操作、算术运算、类型转换、对象操作、方法调用、流程控制、栈操作及其他指令,通过示例展示其功能与栈变化。文章指出字节码指令由操作码和操作数组成,采用前缀表示数据类型(如i代表int),并强调JVM通过验证魔数确保文件合法性。最后推荐了进一步学习资源。
2025-07-31 16:26:06
1318
原创 JVM学习日记(十一)Day11
本文详细解析了Java字节码文件结构,重点介绍了使用javap命令查看字节码信息。文章首先说明了类文件的基本信息,包括修改时间、SHA-256校验值、版本号等元数据。然后深入讲解了常量池的引用机制,通过"#序号"方式引用常量值。在方法解析部分,以一个简单测试方法为例,逐步分析了其对应的字节码指令执行流程,包括操作数栈的变化和局部变量表的使用。特别强调了invokevirtual指令的调用机制和StackMapTable的作用,后者用于JVM在类加载时快速验证字节码类型安全性。最后推荐使用
2025-07-29 19:56:56
1558
原创 JVM学习日记(十)Day10
G1回收器是一种兼顾并行与并发的垃圾回收器,通过分区算法将堆内存划分为多个Region区域,实现分代但不连续的存储方式。其核心特点包括:1)采用可预测时间模型,优先回收高价值Region;2)通过记忆集(RSet)和写屏障维护跨区引用;3)回收过程分为年轻代GC、并发标记周期和混合GC三个阶段。G1适合大内存场景(推荐6GB+),通过参数可调节Region大小、最大停顿时间等。虽然内存占用较高,但能有效平衡吞吐量与停顿时间。当内存不足时会触发FullGC,回退到单线程回收模式。
2025-07-28 15:21:55
1003
原创 JVM学习日记(九)Day9
本文介绍了7种经典JVM垃圾回收器,按执行方式分为串行(Serial/SerialOld)、并行(ParNew/ParallelScavenge/ParallelOld)和并发(CMS/G1)三类,按代分为新生代(Serial/ParNew/ParallelScavenge)、老年代(SerialOld/ParallelOld/CMS)和整堆收集器(G1)。重点分析了各回收器的特点:串行回收器适合单核CPU和调试环境;并行回收器通过多线程提升吞吐量;CMS采用并发标记降低延迟但会产生碎片;G1作为现代默认回
2025-07-26 10:58:02
1174
原创 JVM学习日记(八)Day8
本文主要探讨Java垃圾回收机制中的关键概念。首先解释了GC不能并发执行的原因:可达性分析需要系统快照,必须暂停用户线程以避免标记错误。重点介绍了安全点和安全区机制,指出JVM会在方法调用、循环结束等安全点检查GC条件,而安全区则允许阻塞线程不受检查。文章还详细分析了四种引用类型:强引用(默认方式)、软引用(内存不足时回收)、弱引用(下次GC回收)和虚引用(监控对象回收)。特别说明了虚引用必须搭配引用队列使用,用于资源清理。最后提及终结器引用是JVM内部实现finalize()方法的机制。这些机制共同保障了
2025-07-25 15:04:07
1318
原创 JVM学习日记(七)Day7
本文介绍了JVM垃圾回收的清除阶段及其常见算法。清除算法通过标记不可达对象回收内存,但会产生碎片;复制算法将存活对象复制到新区域避免碎片,但需双倍空间;压缩算法通过移动对象解决碎片问题但耗时较长。文章还讲解了分代收集算法的原理(年轻代用复制、老年代用清除/压缩),以及增量收集和分区算法这两种减少STW时间的方法。最后解释了System.gc()的作用,区分了内存溢出(OOM)和内存泄漏的概念,指出内存泄漏是导致内存溢出的重要原因之一。
2025-07-24 17:47:29
824
原创 JVM学习日记(六)Day6
摘要:G1垃圾收集器通过StringDeduplication机制优化字符串内存,合并相同内容的char[]数组减少堆内存占用。Java垃圾回收采用可达性分析算法(而非引用计数算法),通过GCRoots判断对象存活,但会引发STW暂停。finalize()方法因不可靠已在JDK21被弃用。文章还解释了字符串常量池、char[]与String对象的关系,以及数组扩容本质是创建新对象的原理。
2025-07-23 17:52:54
1164
原创 JVM学习日记(五)Day5
摘要:String是Java中使用最频繁的不可变类,本质是char[]数组(JDK8前)或byte[]数组(JDK9后)。其不可变性体现在修改时会创建新对象而非修改原对象。StringBuilder和StringBuffer是可变的,前者线程不安全但性能更高,后者线程安全但逐渐被弃用。JDK9改用byte[]存储,通过coder标志位区分单字节和多字节字符以节省内存。字符串创建方式不同会影响内存分配,字面量直接存入常量池,new操作在堆中创建对象,intern()强制入池。字符串拼接时,常量拼接直接引用常量
2025-07-22 16:20:53
894
原创 JVM学习日记(四)Day4
本文主要分析了Java中的三种常量池:常量池(存在于.class文件)、运行时常量池(位于元空间)和字符串常量池(位于堆中)。重点阐述了运行时常量池存储初始值,当类被调用时静态变量会转移到堆中的Class对象;字符串常量池从方法区迁移到堆中是为了提高GC效率。文章还详细解析了类加载和对象创建的完整过程(包括检查类加载、内存分配、初始化默认值、设置对象头、执行构造方法等步骤),并介绍了直接内存的特性及其与堆内存的差异。最后总结了各个常量池的区别和对象创建的生命周期,同时说明了字符串常量池迁移的原因及直接内存的
2025-07-21 16:38:09
794
原创 JVM学习日记(三)Day3
【摘要】本文介绍了JVM内存管理的三个关键技术:1)TLAB机制,通过为每个线程分配Eden区的私有空间减少堆内存竞争;2)逃逸分析,JIT编译器对热点代码的优化手段,包括栈上分配、标量替换和同步消除;3)元空间管理,解释其动态调整的GC机制及类加载的惰性特性。文章强调逃逸分析仅在JIT编译热点代码时触发,并指出元空间默认初始值较小可能引发频繁GC的问题。作者建议适当调高元空间初始值,同时提醒读者结合前两篇内容理解JVM内存管理机制。
2025-07-18 17:50:34
901
原创 JVM学习日记(二)Day2
Java运行时数据区分为共享区(堆、元空间)和线程私有区(PC寄存器、虚拟机栈、本地方法栈)。堆采用分代收集策略,包含新生代(Eden+S0/S1)和老年代,通过MinorGC、MajorGC和FullGC进行垃圾回收。虚拟机栈存储方法调用的栈帧,包含局部变量表、操作数栈等结构。PC寄存器记录线程执行地址,确保多线程有序执行。元空间存储类元数据,包含字段方法等信息。文章详细解析了各区域功能及GC机制,包括触发条件、执行特点等,帮助理解JVM内存管理原理。(149字)
2025-07-17 17:51:01
923
原创 JVM学习日记 (一)Day1
本文简要介绍了JVM(Java虚拟机)的基本概念及其在Java程序运行中的作用。JVM作为Java程序的运行环境,将字节码文件转换为机器指令,实现"一次编译,处处运行"的特性。文章详细解析了Java代码的执行流程,包括类加载、字节码校验及解释执行与JIT编译的协作机制,并通过表格对比了两者的特点。重点阐述了类加载器的分类(引导类、扩展类、应用程序类和自定义类加载器)及其双亲委派机制,以JDBC为例说明了打破该机制的特殊场景。最后总结了JVM的核心地位和运行原理,作为入门级技术笔记分享学习
2025-07-10 15:35:40
929
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人