- 博客(38)
- 收藏
- 关注
原创 补充2:使用OQL语言查询对象信息
MAT工具支持OQL(Object Query Language)语言进行堆内存对象查询,语法类似SQL。主要功能包括:1)SELECT子句支持显示对象引用、去重和保留集查询;2)FROM子句可通过类名、正则表达式或对象地址指定查询范围;3)WHERE子句提供条件过滤,支持长度、字符串匹配等操作;4)内置对象访问方法,可查询对象属性、ID、地址及数组长度等。OQL还支持INSTANCEOF查询子类型对象。
2025-07-14 14:50:54
313
原创 补充1:浅堆深堆与内存泄露
本文介绍了Java内存分析中的几个关键概念: 浅堆:对象自身占用的内存大小,如String对象固定为24字节(JDK7); 保留集与深堆:对象被回收时可释放的对象集合及其内存总和,深堆反映真实可回收空间; 支配树:通过对象引用关系分析内存支配情况,帮助识别保留集; 内存泄漏与溢出:泄漏指无用对象未被回收,长期积累导致内存耗尽;溢出则是申请内存时空间不足。 文中列举了8种常见内存泄漏场景,包括静态集合、单例模式、数据库连接未关闭等,并强调合理管理变量生命周期和哈希值的重要性。通过理解这些概念,可以更有效地诊断
2025-07-14 14:49:19
380
原创 分析GC日志
本文摘要: Java虚拟机GC日志分析主要分为GC分类、日志类型解析和日志结构剖析三部分。GC分为部分收集(新生代/老年代)和整堆收集(Full GC),混合收集仅G1 GC特有。日志显示不同收集器特征,如Serial显示"[DefNew",G1显示"garbage-first heap"。通过日志可分析GC原因、前后内存变化及耗时情况,其中real时间应小于sys+user时间。推荐使用GCEasy在线工具或GCViewer离线工具进行日志分析,它们能检测内存泄漏、
2025-07-14 14:48:36
411
原创 JVM运行时参数
本文介绍了JVM参数选项的分类与配置方法。JVM参数分为三种类型:标准参数(如-server、-client)、-X参数(非标准参数,如-Xms设置初始堆大小)和-XX参数(高级配置,包括Boolean和非Boolean类型)。文章详细说明了如何查看当前JVM模式(Server/Client)、运行模式(混合/解释),并提供了在不同环境(如运行jar包、Tomcat部署)中配置JVM参数的示例。最后列举了常用的内存相关参数,包括设置线程栈大小(-Xss)、堆内存初始/最大值(-Xms/-Xmx)等。这些参数
2025-07-14 14:44:36
225
原创 JVM监控及诊断工具-GUI篇
本文介绍了Java性能分析常用工具,包括JDK自带工具和第三方工具。JDK自带工具如JConsole、Visual VM和JMC,可用于监控JVM运行状态、内存、线程等信息;第三方工具如MAT和JProfiler功能更强大,MAT擅长内存泄漏分析,JProfiler提供全面的性能诊断功能。文章详细说明了各工具的安装配置、核心功能和使用场景,帮助开发者根据需求选择合适的性能分析工具,快速定位Java应用性能瓶颈。
2025-07-14 14:40:41
638
原创 JVM监控及诊断工具-命令行篇
JVM监控及诊断工具-命令行篇概述 本文介绍了Java虚拟机(JVM)性能监控和诊断的常用命令行工具。主要包括jps和jstat两个核心工具的使用方法: jps:用于查看正在运行的Java进程,可显示进程ID、主类名、JVM参数等信息。常用参数包括-q(仅显示ID)、-l(显示全类名)、-m(显示main参数)、-v(显示JVM参数)。 jstat:提供JVM统计信息监控,包括类加载、垃圾回收、JIT编译等数据。主要选项有: 类加载:-class 垃圾回收:-gc、-gccapacity、-gcutil等
2025-07-14 14:30:57
1019
原创 再谈类的加载器
类加载器机制概述 核心要点 类加载器是Java虚拟机执行类加载机制的关键组件,负责将类的二进制数据读入JVM并转换为Class对象。主要特点包括: 采用双亲委派模型(但存在例外情况) 包含引导类加载器(Bootstrap)和自定义类加载器两类 同一类由不同加载器加载会被视为不同类 子加载器可见父加载器加载的类,反之则不可 类加载器层级 典型类加载器结构分为三层: 引导类加载器:C++实现,加载Java核心库 扩展类加载器:Java实现,加载扩展库 应用类加载器:Java实现,加载用户类路径内容 重要特性 命
2025-07-14 14:13:47
892
原创 类的加载过程(类的生命周期)详解
类的加载过程(生命周期)详解 Java类的生命周期包括7个阶段:加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备、解析统称为链接阶段。 加载阶段:将类的字节码文件加载到内存,生成Class类实例,作为访问类信息的入口。可以通过多种方式获取类的二进制数据流。 链接阶段: 验证:确保字节码合法合规,包括格式、语义和字节码验证 准备:为静态变量分配内存并设置默认初始值 解析:将符号引用转换为直接引用 初始化阶段:执行类构造器方法,为静态变量赋值。这是类加载的最后一步,也是面试常考点。大厂面试常考察类加载
2025-07-14 14:13:18
1251
原创 字节码指令集
摘要 本文详细介绍了Java虚拟机的字节码指令集,重点分析了加载与存储指令的工作原理和执行机制。主要内容包括: 执行模型:以伪代码形式展示JVM解释器的基本执行流程,包括PC寄存器操作、指令解码和执行循环。 数据类型与指令:说明大多数指令包含数据类型信息,不同类型数据使用不同指令前缀(如i代表int),以及编译器对byte/short/boolean等类型的处理方式。 指令分类:将指令集分为9大类,包括加载存储、算术运算、类型转换等。 加载与存储指令:重点讲解局部变量压栈指令(xload)、常量入栈指令(如
2025-07-14 14:12:05
994
原创 Class文件结构
在Java语言中,要重载(Overload)一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的特征签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包含在特征签名之中,因此Java语言里无法仅仅依靠返回值的不同来对一个已有方法进行重载。在interfaces[]中,各成员所表示的接口顺序和对应的源代码中给定的接口顺序(从左至右)一样,即interfaces[0]对应的是源代码中最左边的接口。常量池中的每一项都具备相同的特征。
2025-07-07 17:19:35
693
原创 垃圾回收器
垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。垃圾收集机制是Java的招牌能力,极大地提高了开发效率。这当然也是面试的热点。为什么要有很多收集器,一个不够吗?因为Java的使用场景很多,移动端,服务器等。所以就需要针对不同的场景,提供不同的垃圾收集器,提高垃圾收集的性能。
2024-12-30 08:00:00
880
原创 垃圾回收相关概念
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象后,将这个虚引用加入引用队列,以通知应用程序对象的回收情况。在系统GC时,只要发现弱引用,不管系统堆空间使用是否充足,都会回收掉只被弱引用关联的对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为nu11,就是可以当做垃圾被收集了,当然具体回收时机还是要看垃圾收集策略。相对的,软引用、弱引用和虚引用的对象是软可触及、弱可触及和虚可触及的,在一定条件下,都是可以被回收的。
2024-09-16 08:00:00
1505
原创 垃圾回收概述及算法
垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。大厂面试题蚂蚁金服你知道哪几种垃圾回收器,各自的优缺点,重点讲一下cms和G1?
2024-09-09 08:00:00
2437
原创 StringTable
简介:在JDK 7中,内部字符串不再分配在Java堆的永久代中,而是分配在Java堆的主要部分(称为年轻代和老年代),与应用程序创建的其他对象一起。当调用intern方法时,如果池子里已经包含了一个与这个String对象相等的字符串,正如equals(Object)方法所确定的,那么池子里的字符串会被返回。许多大规模的Java应用的瓶颈在于内存,测试表明,在这些类型的应用里面,Java堆中存活的数据集合差不多25%是String对象。大的网站平台,需要内存中存储大量的字符串。它的主要使用方法有两种。
2024-09-02 08:00:00
731
原创 9.执行引擎
执行引擎属于JVM的下层,里面包括解释器、及时编译器、垃圾回收器执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
2024-08-26 08:00:00
948
原创 对象实例化及直接内存
不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。通常,访问直接内存的速度会优于Java堆,即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。
2024-08-19 08:00:00
733
原创 jvm之方法区
从线程共享与否的角度来看官方文档:Chapter 2. The Structure of the Java Virtual Machine (oracle.com)《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。所以,方法区看作是一块独立于Java堆的内存空间。在jdk7及以前,习惯上把方法区,称为永久代。jdk8开始,
2024-08-12 08:00:00
791
原创 jvm之堆(Heap)
从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。据我所知所有OpenJDK衍生出来的JVM都提供了TLAB的设计。如何将堆上的对象分配到栈,需要使用逃逸分析手段。这是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。
2024-08-05 08:00:00
843
原创 本地方法接口和本地方法栈
简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C中,你可以用extern “c” 告知c编译器去调用一个c的函数。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。
2024-07-29 08:00:00
845
原创 Java虚拟机栈
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
2024-07-22 08:00:00
672
原创 运行时数据区及程序计数器
本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。
2024-07-15 07:45:00
1237
原创 类加载子系统
在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式扩展加载源防止源码泄漏开发人员可以通过继承抽象类ava.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。
2024-07-08 08:00:00
728
原创 JVM与Java体系结构
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
2024-07-01 21:45:00
1181
原创 springcloudalibaba入门(三)
springcloudalibaba之集成sentinel、Spring Cloud Gateway
2024-05-27 08:41:26
1192
原创 Docker安装Redis,单机与集群
接下来就是要将redis 的配置文件进行挂载,以配置文件方式启动redis 容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。:在5.0以后新增命令replicaof,与salveof效果一致。
2024-04-21 11:38:11
1890
原创 WSL基本使用,Ubuntu->docker->MySQL8
适用于 Linux 的 Windows 子系统 (WSL) 可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。
2024-03-12 13:19:53
1172
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人