自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(295)
  • 收藏
  • 关注

原创 微信运动排行榜设计详解

步数数据存储:使用Redis的ZSet存储用户步数和实时排名,保证查询的高效性和实时性。批量处理与异步任务:通过批量处理和异步任务提高系统的并发处理能力,避免频繁的数据库访问。高可用性设计:采用Redis集群、分库分表、限流和服务降级等技术手段,提升系统的稳定性和可扩展性。

2024-10-11 10:40:41 449

原创 如何降低软件复杂度

软件复杂度是指代码的难以理解、难以维护的程度。它直接影响开发效率、系统的稳定性和可扩展性。软件复杂度不仅来源于代码本身的复杂度,还可能源于架构设计、系统交互、以及业务逻辑的复杂性。模块化设计是将软件系统按照功能、逻辑等标准划分为多个模块,每个模块负责单一功能或逻辑,模块之间通过接口进行通信。通过这种设计,可以将复杂的系统拆分为多个简单的小模块。示例:电商系统模块划分| 订单模块 | | 库存模块 | | 支付模块 || |v v| 用户模块 | | 商品模块 |模块化设计。

2024-10-11 10:40:19 486

原创 利用AOP切面实现多数据源切换

多数据源是指一个系统在运行过程中可能需要访问多个不同的数据库。通常,系统中的不同模块或功能会依赖于不同的数据库,而这些数据库可能位于不同的物理位置,甚至采用不同的数据库管理系统(如MySQL、Oracle、PostgreSQL等)。**AOP(Aspect-Oriented Programming,面向切面编程)**是一种编程范式,它通过将系统中与业务无关的通用逻辑(如日志记录、安全控制、事务管理等)从业务代码中分离出来,避免代码重复,提高系统的可维护性。

2024-10-10 22:27:20 553

原创 为什么有了基本类型还需要包装类?

基本类型是Java中最原始的数据类型,用于存储简单的数值或字符。基本类型在内存中存储的是实际的值,不需要额外的对象或结构来封装。整数类型byteshortintlong浮点类型floatdouble字符类型char布尔类型booleanint a = 10;包装类是对基本类型的对象封装。每个基本类型都有一个对应的包装类,它将基本类型的数据封装为对象。这些包装类通常位于java.langbyte->Byteshort->Shortint->Integerlong->Longfloat->

2024-10-10 22:26:35 721

原创 分布式锁加锁失败后的等待逻辑实现

分布式锁是一种在分布式环境中,用于保证多个节点在并发访问共享资源时的互斥机制。通过分布式锁,可以确保同一时间内只有一个节点能够对共享资源进行操作,从而保证数据的一致性。在分布式系统中,分布式锁是保证多个节点安全访问共享资源的重要机制。在加锁失败后的等待逻辑中,合理的等待策略至关重要,直接影响系统的性能与稳定性。通过选择合适的等待策略(如立即重试、固定间隔重试、指数退避等),可以在加锁失败时有效减少系统负载,避免资源过度竞争。

2024-10-09 12:22:30 395

原创 Netty 相比原生IO模型的优势

Java提供了多种I/O模型,每种模型都有其适用的场景和特点,随着网络应用需求的变化,I/O模型也在不断发展。阻塞I/O(BIO,Blocking I/O)传统的I/O模型,使用简单,但每次I/O操作都会阻塞线程。每个请求需要独立的线程来处理,这在并发请求较少时问题不大,但在高并发情况下,线程资源将成为瓶颈。非阻塞I/O(NIO,Non-Blocking I/O)引入了多路复用技术,一个线程可以处理多个连接,避免了BIO中每个连接占用一个线程的问题。通过Selector。

2024-10-09 11:13:12 438

原创 InnoDB 和 MyISAM 的索引结构区别详解

索引是一种用于加速数据查询的数据结构。它类似于书籍的目录,通过索引,数据库可以快速找到指定数据的位置,而无需全表扫描。索引的好处主要体现在加快查询速度和减少 I/O 操作。InnoDB是 MySQL 的默认存储引擎,支持事务、行级锁定、外键约束等高级功能。它的索引结构基于 B+ 树,并且使用了聚簇索引(Clustered Index),这是 InnoDB 索引结构的核心之一。MyISAM是 MySQL 的另一种存储引擎。它以其简单的设计和高效的查询性能著称,特别适合读多写少的应用场景。

2024-10-08 16:58:46 958

原创 创建索引时需要考虑的关键问题详解

索引是一种特殊的数据结构,用来帮助数据库快速查询记录。它类似于书籍的目录,通过索引,数据库可以避免逐行扫描整个表的数据,而是直接定位到目标记录所在的页,从而加快查询速度。基于查询模式设计索引:索引应该服务于查询需求,优化查询性能是设计索引的首要目标。避免过度索引:虽然索引能提升查询速度,但也会增加写操作的开销。因此,只为常用的查询字段设计索引。选择合适的索引类型:根据具体的查询模式(如等值查询、范围查询、全文搜索等)选择适合的索引类型。

2024-10-08 16:58:24 736

原创 联合索引:何时使用及如何优化

联合索引是指在多个字段上创建的索引,允许数据库在单个索引中存储多个列的信息。当查询包含多个条件时,联合索引可以一次性满足多个字段的查询需求,从而避免多次索引查找或全表扫描的情况。最左前缀原则:联合索引的列顺序决定了查询中必须包含哪些字段,索引才能被利用。设计联合索引时,需要优先考虑常用的查询模式。多条件组合查询:联合索引可以显著加速多条件组合查询,减少数据库的扫描工作量。避免过度索引:尽管索引能够加速查询,但过多的索引会影响写操作的性能。应该根据实际的查询需求设计索引,避免冗余。

2024-10-08 16:57:59 763

原创 查询优化器选错索引:问题分析与解决方案详解

查询优化器是数据库系统中负责为 SQL 查询生成最优执行计划的组件。它会根据查询语句、表的统计信息、索引、数据分布等多种因素,选择最优的执行路径,以最少的资源消耗获取查询结果。查询优化器的目标是生成最优执行计划,但由于多种原因,有时它可能选错索引。查询优化器选错索引是数据库调优过程中经常遇到的问题。通过本文的分析,了解了查询优化器的工作原理以及常见的索引选择误区。我们还介绍了如何通过使用EXPLAIN。

2024-10-08 16:57:41 736

原创 如何保证下订单和扣款操作只能执行一次:技术详解

数据库事务是实现原子性操作的常用手段,ACID(Atomicity, Consistency, Isolation, Durability)是数据库事务的四个关键特性。通过将下订单和扣款操作放在同一个事务中,可以保证两者要么一起成功,要么一起失败,避免了订单成功但扣款失败的问题。幂等性是指一个操作无论执行多少次,结果都是相同的。在支付系统中,幂等性确保重复提交的支付请求只会扣一次钱。在分布式系统中,多个服务或进程可能会同时尝试执行同一个操作,导致并发问题。分布式锁。

2024-10-07 15:22:31 1122

原创 Nacos 推送配置到本地的原理与新增、修改的区别详解

Nacos(Naming Configuration Service)是一个集服务发现、配置管理和动态服务管理于一体的平台,广泛应用于微服务架构。它提供了强大的配置管理功能,支持集中式存储和推送配置到客户端服务,帮助服务之间保持一致的配置信息。Nacos 作为一个强大的配置管理平台,通过长轮询和增量推送机制,能够高效地将配置推送到客户端,并保证客户端始终使用最新的配置。通过合理使用 Nacos 提供的配置管理功能,开发者可以确保配置的可靠性、一致性和安全性。

2024-10-07 15:21:58 933

原创 Redis 缓存淘汰策略:LRU 和 LFU 的缺点及解决方案详解

在高性能分布式系统中,Redis 通常用作缓存层,负责存储经常访问的数据,减少数据库的直接读写压力。当 Redis 作为缓存使用时,由于内存是有限的,因此需要一种机制来决定在内存耗尽时,应该删除哪些数据。这就涉及到缓存淘汰策略的选择。noeviction:当内存不足时,直接返回错误,不进行任何数据的淘汰。:淘汰最近最少使用的键(基于 LRU 算法)。:只淘汰设置了过期时间的键中最近最少使用的键。:淘汰最不常使用的键(基于 LFU 算法)。:只淘汰设置了过期时间的键中最不常使用的键。:随机淘汰键。

2024-10-07 15:20:56 855

原创 JVM 中一次完整的 GC 流程详解(从 YGC 到 FGC)

JVM 将内存分为多个区域,以便于管理和垃圾回收。堆 (Heap):存储所有的对象和数组,是 GC 的主要目标区域。堆进一步划分为年轻代和老年代。年轻代 (Young Generation):存放新创建的对象。年轻代通常较小,GC 发生频繁。Eden 区:新对象首先在 Eden 区创建。Survivor 区:年轻代中的两个 Survivor 区用于存储经过一次或多次 GC 仍存活的对象。老年代 (Old Generation):存放生命周期较长的对象。老年代的 GC 频率较低,但每次执行代价较高。

2024-10-05 16:29:41 1019

原创 实现 Spring IOC 的关键问题和技术详解

IOC 是一种设计模式,它将对象的创建与依赖关系的管理交由容器处理,而不是由应用程序手动控制。Spring 通过 IOC 容器来管理对象的依赖,并在需要的时候自动为对象注入它们依赖的组件。在 IOC 容器中,所有的 Bean 都需要有唯一的标识符,并且容器需要知道如何创建这些 Bean。因此,Bean 的定义和注册是 IOC 容器实现的第一步。Bean 名称:每个 Bean 都有唯一的名称。Bean 类型:用于创建 Bean 的类。作用域。

2024-10-05 16:29:21 801

原创 Spring 事务管理详解:机制与实现

事务(Transaction)是指一个操作序列,必须被作为一个单元来执行,即该操作序列中的所有操作要么全部执行成功,要么全部回滚。事务的主要特性被称为ACID原子性(Atomicity):事务中的所有操作要么全部完成,要么全部取消。一致性(Consistency):事务完成时,数据库从一个一致状态转换到另一个一致状态。隔离性(Isolation):不同事务之间相互独立,互不干扰。持久性(Durability):事务完成后,数据的变更是永久性的。

2024-10-04 14:44:59 637

原创 深入理解 ThreadLocal 参数及其在线程池中的传递机制

是 Java 提供的一个工具类,用于在多线程环境下为每个线程维护独立的变量副本。的变量在线程间是隔离的,每个线程只能访问到自己线程中的副本,其他线程无法访问或修改。用户会话信息存储数据库事务上下文管理日志追踪中的请求 ID是 Java 中一个非常有用的工具类,可以为每个线程维护独立的数据副本,广泛应用于用户会话、事务管理、日志追踪等场景。然而,在线程池中使用时,由于线程复用的特性,会导致数据残留和污染问题。因此,在使用线程池时必须谨慎管理的生命周期,确保任务完成后正确清理。通过使用。

2024-10-04 14:07:58 886

原创 Java 中的对象一定在堆上分配吗?详解

逃逸分析是 JVM JIT(即时编译器)中的一项重要优化技术。它用于分析对象的作用范围,判断对象是否可以逃逸出当前方法或线程。如果一个对象在方法外部不被使用,那么 JVM 可以将这个对象分配到栈上而不是堆上,以减少 GC 的压力。方法内逃逸:对象的所有引用都局限在当前方法内部,未逃逸到其他方法或线程。方法外逃逸:对象的引用被传递到其他方法中,导致对象逃逸出当前方法。线程逃逸:对象被多个线程共享,逃逸到其他线程。标量替换是一种基于逃逸分析的优化技术。

2024-10-04 12:56:42 962

原创 线程同步与线程协作详解

线程同步是指多个线程在访问共享资源时,保证数据的完整性和一致性。由于多个线程可能同时访问或修改共享的内存数据(如变量、对象、文件等),线程同步的目标是防止数据竞争、保持共享资源的一致性。例如,如果两个线程同时访问一个共享变量并进行修改,可能会导致数据不一致的问题。通过同步机制,程序可以确保只有一个线程在某一时刻能够访问共享资源。线程协作是指多个线程之间通过某种机制相互配合,共同完成任务。与线程同步不同,线程协作更多关注的是如何通过线程之间的通信和协调,让不同线程的任务有序执行。

2024-10-01 14:09:00 692

原创 为什么 Kubernetes 的设计中有 Pod,而不是直接使用容器

Kubernetes 中的 Pod 设计为容器编排提供了强大的灵活性和扩展性。通过将多个容器封装在一个 Pod 中,Kubernetes 能够更好地管理容器之间的通信、数据共享和生命周期。在实际应用中,Pod 为开发者提供了强大的工具来管理多容器应用,同时简化了容器的调度和资源分配。尽管 Pod 也有一些局限性,但它无疑是 Kubernetes 成功的核心设计之一。

2024-10-01 14:08:15 957

原创 Kubernetes 中 Pod 和 Node 的关系详解

Kubernetes 是一个开源的容器编排平台,能够自动化地管理容器化应用的部署、扩展和运维。它的核心目标是简化大规模容器的管理,提供弹性、负载均衡、自动恢复等功能。Master 节点API Server:负责处理所有来自客户端和其他组件的 REST 请求。Scheduler(调度器):决定 Pod 应该调度到哪个 Node 上运行。Controller Manager(控制器管理器):负责集群中各个控制器的管理,比如 Pod 副本的维持、节点故障处理等。etcd。

2024-10-01 14:08:02 1094

原创 网关的作用及其高可用性设计详解

网关(Gateway)是分布式系统架构中的一种服务,通常位于客户端和后端微服务之间。它是一个请求处理器,负责接收外部请求并将其转发到内部微服务。请求路由:根据请求的 URL、Header 或其他信息,将请求路由到不同的后端微服务。负载均衡:将客户端请求均衡地分发到多个后端服务节点,避免单个节点过载。安全控制:提供身份验证、授权、SSL/TLS 加密等安全功能。流量控制:包括速率限制、熔断、限流等功能,防止恶意请求或流量突发导致后端服务崩溃。协议转换。

2024-10-01 14:07:29 925

原创 MySQL 为什么一定要有一个主键

主键(Primary Key)是关系数据库中的一个列或多列的组合,它的值能够唯一地标识表中的每一行记录。唯一性:主键的每个值都是唯一的,保证表中没有重复的记录。非空:主键列不能为NULL,必须有明确的值。唯一标识:通过主键,可以快速地找到指定的行数据,起到唯一标识记录的作用。在 MySQL 中,主键可以是单列(Single-column Primary Key)或多列的组合(Composite Primary Key)。MySQL 支持多种存储引擎,其中最常用的是InnoDB和MyISAM。

2024-09-30 12:00:33 898

原创 Redis 中热 Key 的判定及其解决方案

热 Key是指在 Redis 中被频繁访问的某些 Key。热 Key 的访问量远高于其他 Key,可能集中在少数几个 Key 上,导致 Redis 单节点的资源过度消耗,造成服务的性能瓶颈。举个例子,假设一个电商平台有多个商品,但某个爆款商品的访问量远高于其他商品。此时,爆款商品的 Redis Key 就可能成为热 Key。热 Key 是 Redis 中常见的性能瓶颈问题之一,它的存在可能导致系统性能下降、响应时间变慢甚至宕机。

2024-09-30 12:00:06 1185

原创 Spring AOP 在什么场景下会失效?

面向切面编程(AOP)是一种通过横切关注点来增强代码功能的编程范式。在实际开发中,我们通常会有一些通用功能,比如日志记录、安全控制、事务管理等,这些功能横跨多个业务模块,通过 AOP,我们可以将这些横切关注点独立封装,在不侵入业务逻辑的前提下动态增强方法。Spring AOP 是一个非常强大的工具,它允许我们通过切面增强程序的行为,减少代码的耦合度。然而,由于 Spring AOP 的实现依赖于动态代理,在某些特定的场景下,AOP 可能会失效。

2024-09-30 11:59:44 937

原创 如何用Redis统计亿级网站的UV

UV(Unique Visitor)是指在一天之内,一个网站或应用被不同的用户访问的总次数,多个访问来源自同一用户只计为一次。数据规模大:每天可能有上亿用户访问,如何高效存储这些数据。高并发:网站高并发下,如何确保 UV 统计的实时性和准确性。内存限制:Redis 是基于内存的数据库,如何优化内存使用,使系统能够承受高负载。在大规模网站的 UV 统计中,Redis 提供了高效且灵活的解决方案。

2024-09-30 11:59:21 1290

原创 Synchronized自旋锁的实现原理及代码详解

通过本文的学习,我们深入探讨了的自旋锁机制及其在Java中的实现。自旋锁作为一种优化手段,能够在短时间锁竞争的场景下显著提升性能,减少线程的阻塞和上下文切换。我们通过代码示例展示了自旋锁的实现,并分析了其优劣势。自旋锁并不适合所有场景,但通过JVM中的自适应自旋锁优化,它能够在合适的场景下大幅提高系统的并发性能。开发者需要根据实际需求选择合适的锁机制,结合场景进行性能调优。

2024-09-29 10:25:17 1010

原创 实现一个消息队列系统的设计与实现详解

消息队列是一种异步消息通信机制,通常用于在分布式系统中实现解耦、异步处理、负载均衡、削峰等功能。它允许系统中的不同组件通过消息传递来进行通信,而无需直接调用彼此的接口。生产者(Producer):负责向消息队列中发送消息。消费者(Consumer):负责从消息队列中消费消息。消息队列(Queue/Broker):负责存储消息,管理消息的传递和消费。实现一个消息队列系统涉及到多个方面的设计和实现,包括消息的存储与持久化、消息传递与消费机制、消息确认与可靠性保证、分布式协调、监控与管理等。

2024-09-29 10:24:47 830

原创 Kafka 消费者状态及高水位(High Watermark)详解

Kafka 消费者负责从 Kafka 的分区中读取消息。消费者可以独立工作,也可以以消费者组(Consumer Group)的形式进行消费。在消费者组中,Kafka 会确保每个分区仅被一个消费者消费,以防止数据重复消费。消费者组的分区分配是动态的,如果消费者加入或离开消费者组,Kafka 会进行重平衡(Rebalance)以重新分配分区。了解消费者的工作状态对于监控 Kafka 系统的健康和确保消息消费的正确性至关重要。

2024-09-29 10:24:15 1260

原创 Kafka 的重平衡问题详解及解决方案

重平衡(Rebalance)是 Kafka 在消费者组内部重新分配分区(Partition)的过程。Kafka 的消费者组是一个逻辑概念,它允许多个消费者实例(Consumer)共同消费一个或多个主题(Topic)的分区。每个分区只能被一个消费者组中的一个消费者消费。因此,重平衡的目的是确保分区在消费者组中的消费者之间合理分配。Kafka 提供了多种分区分配策略,但在某些业务场景中,开发者可以根据需求实现自定义的分区分配策略,确保分区分配的灵活性和均衡性。// 实现自定义分区分配策略@Override。

2024-09-29 10:23:56 897

原创 MySQL的行级锁到底锁的是什么?详解MySQL行级锁机制

行级锁是MySQL中的一种细粒度锁,顾名思义,它锁定的是表中的具体数据行。相比于表级锁(Table-level Lock),行级锁允许多个事务在同一个表中并发执行不同行上的操作,而不会互相阻塞。特点:细粒度:行级锁只锁定具体的行,而不是整个表,适用于高并发场景。高并发性:多个事务可以同时锁定不同的行,减少锁竞争。开销较大:相比于表级锁,行级锁需要更多的资源来维护锁的状态,开销更大。

2024-09-28 16:12:34 1150

原创 公平锁与非公平锁的区别及其在 ReentrantLock 中的实现详解

公平锁是指线程获取锁的顺序严格按照它们请求锁的顺序进行。即每个线程获取锁的顺序与它们排队的顺序保持一致,类似于在银行排队取号的机制。公平锁的实现通过一个先进先出的队列(FIFO)来管理线程,当某个线程持有锁时,其他线程会进入等待队列,直到轮到自己。特点保证每个线程都能够公平地获得锁。避免了线程饥饿问题。示意图:公平锁的锁获取流程| 线程1 请求锁 | ---> 进入等待队列| 线程2 请求锁 | ---> 进入等待队列| 线程3 请求锁 | ---> 进入等待队列。

2024-09-28 16:08:59 1231

原创 Redis 实现分布式锁时需要考虑的问题

分布式锁是一种协调机制,用于确保在分布式系统中多个进程或线程可以安全地访问共享资源。通过分布式锁,可以确保在同一时间只有一个节点可以对某个资源进行操作,从而避免数据竞争或资源冲突。Redis作为一种高性能的内存型数据库,因其对原子操作的支持和极高的吞吐量,被广泛应用于分布式锁的实现中。然而,使用Redis实现分布式锁时,开发者需要考虑多个问题,包括锁的获取与释放、超时处理、宕机容错、网络分区等。通过合理的设计和优化,可以保证Redis分布式锁在高并发环境下的稳定性和安全性。

2024-09-28 16:02:23 1347

原创 分库分表方案中的数据倾斜问题及解决方案详解

分库分表是将数据库中的数据按照一定的规则,划分到多个数据库或多个表中,从而降低单个数据库的压力,提升数据读写的性能。分库分表的核心思想是通过“水平拆分”实现数据库的扩展性。分表不分库:将数据拆分到一个数据库中的不同表中。分库分表:将数据拆分到多个数据库和多个表中。示意图:分库分表架构| 请求1 | -----> | 库1 | 库2 | 库3 || | || 请求2 | |表1| |表2| |表3|数据倾斜。

2024-09-28 12:59:03 1026

原创 CompletableFuture 和 ExecutorService 的区别详解

是Java并发框架的一部分,它是一个接口,用于管理并发任务的执行。通过线程池来执行异步任务,可以帮助开发者管理线程的生命周期,避免手动创建和销毁线程的开销。是Java 8引入的一个类,用于支持异步编程。它的设计初衷是简化任务的异步执行与结果的处理,提供了一种更加简洁和优雅的方式来管理异步任务的组合、依赖与回调。与不同,内置了任务链与回调机制,可以轻松处理任务的组合、结果获取及异常处理。和是Java并发编程中两个非常重要的工具。尽管它们都可以用于异步任务的执行,但它们各自的应用场景和功能特点有所不同。

2024-09-28 12:56:47 1094

原创 如何处理外部接口的RT(响应时间)无法保证问题

响应时间是指从发出请求到收到响应的时间。对于系统的调用链而言,外部接口的RT对系统整体的性能至关重要。如果外部接口的响应时间过长或波动剧烈,可能会导致调用方出现超时、队列积压,甚至引发系统宕机。支付系统:与第三方支付网关通信时,响应时间可能因为高并发和网络问题而变得不可预测。电商系统:商品库存、物流查询等依赖外部接口的系统,面临较大的RT波动风险。消息推送系统:短信和邮件推送服务调用第三方接口,RT可能受服务提供商的负载影响。

2024-09-28 12:54:28 977

原创 安全点的应用场景及其原理详解

安全点(Safepoint)是JVM运行过程中,所有Java线程必须达到的一个特定状态点。在这个点上,所有线程都会暂停执行,进入一个安全的状态,以便JVM执行某些全局操作。线程在执行到某个特定的安全点时,才能安全地被暂停,而线程不能在任意位置暂停,这是为了保证暂停时系统状态的一致性。每个线程在达到安全点时,会等待JVM进行的全局操作(例如垃圾回收或其他操作)完成,然后恢复执行。这种机制确保在进行全局操作时,线程之间的数据不会发生不一致的情况。

2024-09-28 12:52:48 1315

原创 什么东西可以当做GC Root,跨代引用如何处理?

GC Root是Java虚拟机垃圾回收(GC)过程中追踪活动对象的起点。GC Root用于标识存活对象,它们是垃圾回收器在执行标记-清除或其他回收算法时,首先检查的对象。GC Root本身始终被认为是存活的对象,任何直接或间接被GC Root引用的对象也会被视为存活对象。在Java虚拟机中,垃圾回收器通过从GC Root开始遍历对象图(通常采用可达性分析算法),来判断哪些对象是存活的,哪些对象可以被回收。这一过程称为“根可达性分析”。

2024-09-28 11:46:00 1106

原创 初始标记和重新标记为何需要STW(Stop-The-World) —— 深入解析CMS垃圾回收的原理

在Java中,垃圾回收器负责自动管理内存,回收不再使用的对象。这种机制极大地简化了开发者的工作,但为了实现高效的垃圾回收,垃圾回收器必须面对如何在回收内存的同时,最大限度地减少对应用程序运行的影响这一挑战。垃圾回收的基本原理是:通过标记那些不可达的对象,然后将其回收。这一过程通常分为标记和清除标记阶段:识别哪些对象是存活的,哪些对象是可以被回收的。清除阶段:释放那些已标记为不可达的对象所占用的内存空间。

2024-09-28 10:21:37 858

原创 CMS垃圾回收过程详解:为什么分成四步

垃圾回收的核心目标是回收不再使用的内存对象,并使其内存空间可供新对象使用。不同的垃圾回收算法根据性能、停顿时间、吞吐量等要求设计了不同的内存回收策略。Serial GC:单线程执行垃圾回收,适用于小型应用。:多线程并行执行,适合高吞吐量应用。G1 GC:控制停顿时间的垃圾回收器,适用于大内存应用。CMS GC(Concurrent Mark-Sweep Garbage Collector)是其中的一种,以低停顿时间为核心目标,适用于对延迟敏感的应用场景,如Web服务器、金融交易系统等。

2024-09-28 10:18:30 305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除