- 博客(134)
- 收藏
- 关注
原创 字符串拼接“暗战“
语法糖,也译为糖衣语法,是由英国计算机科学家彼得·兰丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。的空参构造器,默认的字符串容量是16,如果需要存放的数据过多,容量就会进行扩容,我们可以设置默认初始化更大的长度,来减少扩容的次数。是线程安全的,因为它的方法都是同步的,这意味着它是安全的,可以在多线程环境中使用。类是不可变的,所以所谓字符串拼接,本质都是重新生成一个新的字符串。知道了“+”底层之后,如果在循环中,使用“+”拼接字符串,会创建大量的。
2025-03-18 15:20:31
761
原创 7天看完50+应届生简历后,我想说几句真话
项目经验千篇一律,缺乏亮点、侧重点,这是我看到的最多的问题,首先分析一下,想一想为什么会是这样?在写完工作经验后建议写一个工作业绩小模块,来体现你整体的工作成就,可以将取得的成果量化,尽可能用数字和百分比来描述你的成绩,例如:提高了20%的销售额、管理了10人的团队、由3s降低到30ms,性能提高100倍、项目运行很稳定,很少接到用户投诉。对于这个问题,我建议你把你会的前端技术融入到一个后端项目中去,前端技术提一两句,但重点要写后端项目,这样既可以证明你的技术全面,又不会让无关的信息喧宾夺主。
2025-03-17 21:30:03
796
原创 ThreadLocal深度解析:线程专属的存储空间
实例)是弱引用(可被垃圾回收),但 Value 的强引用会随线程存活而长期存在。若线程生命周期长(如线程池线程),且未显式清理。每个线程(员工)有自己的储物柜,存的东西(变量)其他线程拿不到,解决了多人共用储物柜时物品混乱的问题。是Java提供的线程本地变量机制,它为每个使用该变量的线程创建。)的轻量级实现,而非数据拷贝,因此无需同步锁即可保证线程安全。),同时确保不同线程之间的连接完全隔离。类本身并不存储线程本地变量的值,而是通过。的线程隔离依赖于线程对象(,实现线程间的数据隔离。
2025-03-10 19:40:23
763
原创 AQS秒懂指南
/ 1. 创建自定义锁// 核心:AQS实现类// 2. 继承AQS实现同步逻辑// 后续步骤在此补充// 3. 对外暴露加锁/解锁接口。
2025-03-06 19:22:23
854
原创 多线程的“智能调度专家“
在实际开发中,使用自定义线程池是管理并发任务的一种有效方式。相比于使用Executors工厂类提供的预定义线程池,自定义线程池能够提供更灵活的配置选项。在许多高并发场景下,推荐使用自定义线程池来精确控制资源分配和任务处理。参数名称定义推荐值配置依据核心线程数CPU核数 + 1充分利用CPU资源最大线程数CPU核数 * 2应对突发流量空闲线程存活时间30-60秒平衡资源释放速度unit时间单位定义的具体时间单位workQueue任务队列防止无限制堆积线程工厂提供自定义的线程创建方式拒绝策略。
2025-03-03 12:16:55
881
原创 驾驭并发编程的混沌之海
比如餐厅后厨,多个厨师(线程)需要共享有限的资源如灶台(CPU)、食材(内存)和厨具(I/O设备),通过合理的调度和协作来确保菜品高效地制作完成;同样地,在交通枢纽,车辆(线程)通过红绿灯(锁)、立交桥(无锁结构)以及ETC通道(原子操作)等机制实现交通流的顺畅运行。就像城市交通规划,我们既需要红绿灯(锁)维持秩序,也需要高架桥(无锁结构)提升效率,更需要智能导航系统(调度算法)实现全局最优。在这个过程中,开发者既是规则的制定者,也是系统的观察者,需要在控制与放任之间找到精妙的平衡点。
2025-02-26 19:15:57
657
原创 Integer == int?揭秘包装类比较陷阱
时,就像是给同一个数字穿上了不同的衣服,一个穿着对象的外套,一个保持着原始数据的质朴。但它们的比较结果却暗藏玄机。,如果缓存池有现成的,直接取用(返回缓存对象);如果没有就创建新对象。方法就是通往缓存池的秘密通道!当你在Java中写下。对象进行缓存(可通过。
2025-02-24 19:10:48
684
原创 深度解析new String(“abc”)的对象创建机制
对象,使其表示与实参相同的字符序列。换句话说,用这个方法新创建的字符串是实参字符串的副本。除非需要显式复制形参的值,否则没有必要使用这个构造函数,因为字符串是不可变的。第一个对象是"abc",它属于字符串字面量,因此编译时期会在字符串常量池中创建一个字符串对象,指向这个 “abc” 字符串字面量,而使用。的方式会在堆中创建一个字符串对象。在堆中创建一个字符串对象,并且使用。的方式创建字符串是创建两个对象。创建一个测试类,用字节码观察,文档注释大意:初始化新创建的。(new执行时创建)的字符串对象,它指向。
2025-02-23 19:10:53
655
原创 Java编译器的「消失魔术」
文件之后,源代码中所有的泛型信息都会被移除,可以认为源代码中泛型相关的信息,就是提供给编译器用。泛型信息对Java编译器可见,但在运行时对Java虚拟机不可见。:当你写泛型代码时,Java编译器会在编译阶段进行类型检查,确保你使用的类型是正确的。例如,如果你声明一个。:一旦编译完成,所有的泛型类型信息都会被移除,这个过程叫做“类型擦除”。你有一个神奇的盒子,它能自动识别放入的物品类型。,编译器会确保你只能向这个列表添加字符串;Java中的泛型是通过一种称为。
2025-02-23 08:00:00
946
原创 Java整合文件上传功能
Slf4j@Override/*** 判断是否是当前平台处理* @param platformType 指定平台类型 {@linkplain ArchetypeFilePlatformType}* @return true 为当前平台处理*//*** 校验允许上传的文件格式;默认{@code FileTypeUtils.DEFAULT_ALLOWED_EXTENSION}* @param fileName 文件名称* @return true 允许上传*/
2025-02-21 09:45:00
719
原创 Java定时任务可视化管理
*** 线程本地变量*/@Overridetry {= null) {log.error("任务执行异常 - :", e);/*** 执行前* @param context 工作执行上下文对象* @param sysJob 系统计划任务*//*** 执行后* @param context 工作执行上下文对象* @param sysJob 系统计划任务*/
2025-02-20 15:23:37
387
原创 Java世界的「X光透视机」
想象你走进一个神秘房间,房间里摆满了上锁的宝箱。正常情况下你需要对应的钥匙才能打开每个箱子,但突然你获得了一个万能开锁器,这个“万能开锁器”就类似于是Java反射!反射允许你在程序运行时动态地获取类的信息(如方法、字段等),甚至可以调用这些方法或访问这些字段,即使它们被声明为private。这意味着你可以像拥有X光视力一样,“透视”任何对象的内部构造,并根据需要调整或操作它们。透视任意类的内部结构:就像使用X光扫描一样,可以查看类的所有成员。访问私有方法:突破private。
2025-02-20 14:31:28
691
原创 Java字符串到底能有多长
编译期:硬编码字符串的最大长度为65534个字符,超过这个限制会导致编译错误。运行期:理论上可以达到Integer.MAX_VALUE(21亿),但在实际应用中受限于系统内存和JVM配置。65534:代码中直接写字符串的最大字符数。21亿:程序运行时字符串的理论最大长度(但别真这么干!合理管理字符串长度,给内存留出足够的空间,就像吃饭八分饱,字符串长度也要留余地,给内存呼吸的空间才是好程序!
2025-02-18 17:03:39
1158
原创 为什么Java的String一出生就「不可变」
从Java 9开始,字符串内部改用byte[]存储,根据内容自动选择Latin-1或UTF-16编码。四重「空间换时间」的魔法,最终实现了性能与安全的完美平衡。这种设计哲学深刻影响了后来的Scala、Kotlin等JVM语言,成为编程界教科书级的范例。在每秒百万级并发的系统中,不可变性让字符串成为线程间最安全的信使。下次当你写下String时,别忘了,你正在使用的,是一个凝聚了25年智慧结晶的计算机科学艺术品!这种魔法优化的前提正是字符串不可变!这个看似简单的设定,背后竟隐藏着语言设计者的大智慧!
2025-02-17 19:09:17
1120
原创 Java对象复制:深拷贝 vs 浅拷贝
这类操作通常出现在不同层之间的数据传递或转换中,例如将数据传输对象(DTO)转换为持久化对象(PO),或是将持久化对象(PO)转化为视图对象(VO)。数据转换有助于隔离各层之间的业务逻辑,避免不同层之间的紧耦合,同时优化代码的可维护性和可扩展性,提升模块或系统之间的数据兼容性。这意味着,深拷贝后的对象和原对象在内存中完全隔离,修改其中一个对象的字段不会影响另一个对象。浅拷贝创建一个新对象,这个新对象的字段内容与原对象相同,当字段是基本数据类型时,值被直接复制;时(如包含集合、自定义对象等),
2025-02-16 09:32:56
1051
原创 GitHub Pages自定义域名配置
点击"添加记录",在此处选择"CNAME",配置刚申请的域名和GitHub Pages提供的域名,将其做映射。国际平台(免备案):Namecheap、GoDaddy。配置完成之后如下图:(配置一条记录即可,此处我配置两条记录是有其他用途)。在此处填入之前注册备案过的域名,并勾选"Enforce HTTPS "。在自己GitHub主界面点击"Settings"。找到"Pages",点击"Pages"。在刚注册的域名列表后点击。等待片刻就能访问备案过的。
2025-02-12 21:01:52
309
原创 网络与安全
DDoS(Distributed Denial of Service)分布式拒绝服务攻击,是指攻击者控制分布于互联网各处的大量僵尸主机向攻击目标发送大量垃圾报文或者对目标服务器发起过量访问,耗尽攻击目标所在网络的链路带宽资源、会话资源或业务系统处理性能,导致其无法响应正常用户的服务请求。HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是HTTP协议的安全版本,采用SSL/TLS协议对数据进行加密和验证,来保证数据传输过程中的安全性和完整性。
2024-12-15 19:33:20
1070
1
原创 鸿蒙系统崛起与开发者机遇
鸿蒙操作系统(HarmonyOS)随着其不断发展,正在改变全球科技格局。鸿蒙不仅在智能手机领域展现了强大的潜力,还在智能穿戴、车载、智能家居等多个行业获得广泛应用。随着鸿蒙生态系统的不断完善,开发者面临着前所未有的机遇和挑战。本文将探讨鸿蒙生态中的机遇和挑战,分析如何抓住机会,克服挑战,推动更好的应用发展。
2024-11-24 13:37:09
414
原创 软件开发的未来:AI 大模型与智能代码生成
例如,GitHub Copilot 就是一个典型的应用,通过结合 AI 大模型的技术,能根据开发者输入的函数名称、注释或参数等信息,智能地推测并生成完整的代码块。AI 大模型的应用远不止于自动化代码生成。AI 大模型能够将复杂的编程任务转化为简单的语言描述,开发者只需用自然语言描述他们的需求,AI 就能自动生成符合要求的代码。未来,AI 与开发者的协作将不再是单纯的代码生成,而是更深层次的合作,AI 将成为开发过程中不可或缺的一部分,帮助开发者提升决策效率,优化架构设计,甚至参与项目的全生命周期管理。
2024-11-24 13:26:08
1069
原创 常用算法详解
算法英文对应的单词是Algorithm,它的本意为解决问题的方法,所以算法直接理解就是解决问题的方法。在计算机领域定义就是一系列解决问题的、清晰、可执行的计算机指令。算法是在计算机科学中用于解决特定问题的一系列明确且有限的步骤或规则。它以输入数据为基础,通过确定性操作生成输出结果,强调高效性和可行性。常见算法包括排序、查找、动态规划、分治法和贪心算法等,主要评估指标为时间复杂度和空间复杂度。算法的设计与优化直接影响程序性能,是计算机编程的核心内容之一。算法复杂度是衡量算法性能的重要指标,主要包括时间复杂度和
2024-11-23 15:49:15
1356
1
原创 常用数据结构与算法
数据结构是一门研究数据组织方式的学科,是编程语言的重要组成部分。学好数据结构,可以编写出更高效的代码,同时为学习和掌握算法奠定坚实的基础。数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。
2024-11-23 15:48:12
1000
原创 常用数据结构详解
数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。链表由节点和指针组成,能够动态调整大小,适用于频繁插入和删除的场景。栈遵循后进先出(LIFO)原则,通常用于处理递归和表达式求值等问题。队
2024-11-19 23:04:48
1198
原创 SpringCloud详解
"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。客户端的请求先通过匹配规则找到合适的路由,映射到具体的服务,然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。它并不是一个框架,而是很多个框架。
2024-11-17 08:00:00
1043
原创 微服务治理详解
—大意:简而言之,微服务体系结构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务运行在自己的进程中,并与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署。对这些服务的集中管理是最低限度的,这些服务可能用不同的编程语言编写,并使用不同的数据存储技术。
2024-11-16 22:55:12
1191
原创 this关键字详解
在JVM内部,它通过栈帧管理和字节码指令实现了对当前对象的引用,使得实例方法可以操作调用对象的属性和方法。它是类内部对当前对象的引用,因此在实例方法或构造方法中,可以通过。看成一个特殊变量,它保存着当前对象的内存地址,并允许你在类内部访问该对象的属性和方法。的执行原理在于它是一个隐式传递的参数,指向当前对象实例,并在编译和执行过程中通过。在多线程环境中,JVM为方法分配独立的栈帧,每个线程操作自己的栈,因此。是一个内置的引用,代表了“当前对象”,它指向当前对象的实例。是一个特殊的引用,指向当前对象的实例。
2024-11-01 08:00:00
1210
原创 transient关键字详解
这是因为static字段属于类而不是某个具体的对象,序列化是对象级别的操作,它保存的是对象的实例状态,而static字段是类级别的状态,不属于任何具体对象,因此在序列化过程中被忽略。也就是说,使用transient修饰的字段在序列化过程中将被忽略,反序列化时这些字段会被初始化为默认值,基本数据类型为0,引用类型为null。transient译为“临时的”,它可以阻止字段被序列化到文件中,在被反序列化后,transient字段的值被设为初始值,比如int型的初始值为0,对象型的初始值为null。
2024-08-18 16:52:50
2526
原创 strictfp关键字详解
BigDecimal的运算逻辑完全在Java的标准库中实现,并不依赖于任何特定平台的硬件或操作系统的浮点运算单元,所以在任何平台上使BigDecimal进行相同的计算时,结果都是一致的,但并不是它在所有场景下都是最合适的选择。在没有使用strictfp时,Java虚拟机可能利用硬件浮点运算的特性来优化计算,这就可能导致在不同平台上,浮点运算的结果不完全一致。而且大多数应用程序的浮点计算已经足够一致,满足了实际需求,因此不需要额外的strictfp关键字来保证浮点运算的一致性,strictfp了解即可。
2024-08-18 08:00:00
1039
原创 static关键字详解
除此之外,这种理解有助于优化类的加载性能,减少不必要的初始化开销,并能够正确实现一些设计模式,确保类在多线程环境下的稳定性。例如,静态变量用于保存所有对象共享的状态,而静态方法可用于提供通用的工具函数,这些功能可以直接通过类名访问,无需实例化对象。是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。时,JVM在方法区为这些静态成员分配内存,这块内存被所有类的实例共享,并在整个类的生命周期内保持不变,所以静态变量不需要为每个对象实例重新创建。
2024-08-11 08:00:00
859
1
原创 Netty高性能数据结构
它的基本思路是在哈希表中发生冲突时,线性地探测哈希表中的下一个位置来寻找空闲的存储位置。时间轮算法将时间分割成一个个固定大小的时间片,并将任务安排到相应的时间片上,从而优化了定时任务的管理。类型的无锁队列,允许多个线程同时提交任务,而由单个事件循环线程处理这些任务。它通过将定时任务分配到轮盘上的不同槽位来避免高频率的任务调度开销,这种设计主要用于处理大量的定时任务。所谓的高性能数据结构是指,那些在特定场景下优化了性能和效率的数据结构,通常能够提供更快的操作速度、更低的内存消耗或更高的并发处理能力。
2024-08-07 21:36:14
913
原创 Netty内存池管理
内存池将内存分为不同大小的块,每个大小对应一个内存池。实际就是一个队列,当内存释放时,将内存块加入队列当中,下次再分配同样规格的内存时,直接从队列中取出空闲的内存块。会检查其内存区域中的空闲块,并从中选择一个可用的块进行分配。来管理较大的内存块,通过伙伴算法和二叉树结构进行内存分配。中获取内存块,如果缓存中没有,才会从全局内存池中获取。它的主要作用是管理内存池中的小内存块,在分配的内存大小小于一个。向操作系统申请内存的单位,所有的内存分配操作也是基于。,可以快速分配和回收内存块,减少对全局内存池的争用。
2024-07-31 20:58:02
472
原创 Netty详解
Netty是一个高性能、异步的网络应用框架,用于开发高效的网络通信程序。它是JavaNIO的一个抽象,简化了网络编程的复杂性,并提供了一系列高级功能,使网络编程变得更简单。Netty是一个高效的网络框架,专注于处理大量并发连接。它通过异步IO处理来避免阻塞,这让它在处理高并发时表现出色。Netty还利用了优化的内存管理和零拷贝技术,降低了性能开销。框架的灵活性也很高,开发者可以通过管道机制自定义数据处理流程,API和文档丰富,帮助简化网络编程。不过,Netty。
2024-07-31 20:40:14
5102
原创 Redis内存管理
达到内存限制时,它会在所有设置了过期时间的键中选择最近最少使用的数据进行淘汰。页面置换算法:进程运行时,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区,其中选择调出页面的算法就称为页面置换算法。默认最大内存是全部的内存,我们在实际配置的时候,一般配实际服务器内存的3/4也就足够了。算法常用于缓存管理,目的是在缓存满时,保留最常使用的数据,同时移除最久未被使用的数据。专注于管理设置了过期时间的键,优先淘汰过期数据,保留未过期的键。
2024-07-30 11:55:24
997
1
原创 Redis部署策略
它的主要优点是能够处理大规模的数据和高并发请求,自动故障转移功能减少了服务中断时间,同时分散了数据和负载,减少了单点故障的风险。如果主节点出现故障,可以将从节点提升为新的主节点,实现一定程度的容错和数据恢复。不过,由于主从复制默认是异步的,从节点的数据可能会有延迟,导致读取的数据可能不是最新的。它的主要优点是能够自动处理主节点故障,将从节点提升为新的主节点,从而减少服务中断时间,增强系统的稳定性和可靠性。前者称为主节点,后者称为从节点,数据的复制是单向的,只能由主节点到从节点。一旦选定新的主节点,
2024-07-29 12:15:15
543
1
原创 Redis与缓存
可以设置自动重试机制,如果更新操作失败,系统会尝试重新执行更新,增加成功的可能性,虽然这样可能会增加系统的负担。另一种方法是使用备用缓存,在主缓存更新失败时,将数据写入备用缓存,并在主缓存恢复正常时进行同步,这样可以保持系统的正常运转。缓存穿透的原因通常是,用户请求的数据在缓存和数据库中都不存在,或者是请求的数据在缓存中未命中,直接查询数据库,并未将结果正确地缓存起来。在更新源数据时,同时更新缓存和源数据库。缓存击穿 是指在缓存中某个热点数据的缓存失效时,多个请求同时访问数据库,导致数据库压力剧增的情况。
2024-07-29 12:13:05
519
原创 基于Redis的分布式锁的演进
加过期时间释放锁的这种方式会带来另一个问题,某个线程加锁,然后执行业务代码,业务代码执行的时间超过了限定时间,此时Redis会释放锁,然后第二个请求就进来了,此时第一个线程业务代码执行完毕,执行释放锁步骤。对于上面的解决方法,其实并没有真正的解决缓存续期的问题,还是会带来能存在锁过期释放,业务没执行完的问题。针对缓存续期的问题,我们可以开一个守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。当释放锁时,节点会检查锁的持有者是否匹配,只有匹配的情况下才会删除锁。
2024-07-27 12:54:52
1127
原创 分布式锁详解
它管理数据一致性,防止多个节点同时修改相同数据,处理资源竞争,保障事务原子性,避免任务重复执行,同时协调和同步节点操作,减少死锁的可能性。例如,在表中记录锁的创建时间,并定期检查是否超时,如果超时则自动释放锁。只有在比自己序号小的节点被删除后,才会再次检查自己是否成为最小的节点,进而获取锁。利用顺序节点实现锁的公平性,保证了锁的获取顺序。,查出来的数据是相同的,然后依次执行库存减一操作,此时库存会变成-1件,这就造成了超卖问题。当释放锁时,节点会检查锁的持有者是否匹配,只有匹配的情况下才会删除锁。
2024-07-27 12:50:48
2200
13
原创 分布式ID详解
在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了,这个时候就需要生成分布式。适用于并发不高,但是数据量太大导致的分库分表扩容,可能每秒最高并发最多就几百,那么就走单独的一个库和表生成自增主键即可。雪花算法相对来说还是比较靠谱的,毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的,能达到百万计。生成,如果是高并发啥的,那么用这个应该性能比较好,一般每秒几万并发的场景,也足够用了。
2024-07-26 17:24:18
1013
原创 SpringBoot详解
SpringBoot提供了一种新的编程范式,可以更加快速便捷地开发Spring项目,在开发过程当中可以专注于应用程序本身的功能开发,而无需在Spring配置上花太大的工夫。因此,把应用的主类放在根包中,SpringBoot就会自动扫描并加载所有需要的组件和配置,让你可以专注于编写业务代码,而不用担心复杂的配置细节。启用了SpringBoot的自动配置功能,SpringBoot会根据项目中的依赖,自动配置很多常用的 Spring组件,这样就不需要手动配置它们。在实际测试中,有时候需要测试场景中加载配置,
2024-07-26 15:52:30
23917
1
原创 内存泄漏详解
内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践会导致对象的生命周期变得很长,甚至导致00M,也可以叫做宽泛意义上的“内存泄漏”。举个例子,创建的连接不再使用时,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。忘记关闭这些资源会导致持续占有内存,无法被GC回收。这样就会导致内存泄露,最终导致内存溢出。try{
2024-07-23 10:54:03
4719
1
原创 如何从代码层面避免内存泄漏
内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。内存泄露最明显问题频繁GC,从而STW次数增加,导致用户体验变差。如果内存泄露问题严重,会导致OOM,直接导致程序不能正常运行。大多数内存泄露的原因是,长生命周期的对象引用了短生命周期的对象。例如,A对象引用B对象,A对象的生命周期(t1-t4)比B对象的生命周期(t2-t3)长的多。当B对象没有被应用程序使用之后,A对象仍然在引用着B对象。这样,垃圾回收器就没办法将B对象从内存中移除,从而导致内存泄露问题。
2024-07-22 17:16:47
869
1
免费吐血整理,前端知识点总结,课程学习路线及学习链接
2024-04-17
项目中有 10000 个 if else 如何优化
2024-07-14
对多线程并发、线程安全的理解
2024-07-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人