自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Nacos详解

Nacos是Dynamic Naming and Configuration Service的首字母简称,即动态命名与配置服务。它是一个为构建云原生应用而生的平台,提供了一组简单易用的特性集,助力开发者快速实现动态服务发现、服务配置、服务元数据及流量管理等功能。

2025-04-26 18:13:24 1059

原创 Swagger2:API 开发与文档生成的得力助手

Swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web API。它提供了一系列的工具和标准,使得开发人员可以轻松地定义 API 的结构、参数、响应等信息,并自动生成详细的 API 文档。同时,Swagger2 还支持在线测试 API,方便开发人员和测试人员进行接口调试。在类中,通过ApiInfo.title("Spring Boot Swagger2 API 文档").description("这是一个使用 Swagger2 生成的 API 文档示例")

2025-04-26 17:48:58 957

原创 线程池(六):ThreadLocal相关知识详解

ThreadLocal是Java中的一个类,它提供了线程本地变量的功能。简单来说,每个使用ThreadLocal的线程都拥有自己独立的变量副本,各个线程之间的变量副本相互隔离,互不干扰。这就解决了多线程环境下变量共享的冲突问题。在多线程编程中,当多个线程同时访问一个共享变量时,可能会出现数据不一致等并发问题。而ThreadLocal可以让每个线程都有自己专属的变量,就好像每个线程都“私藏”了一份变量,各自使用各自的,从根本上避免了线程间对共享变量的竞争。

2025-04-26 17:13:01 1011

原创 线程池(五):线程池使用场景问题

可以使用一个计数器来记录当前正在访问方法的线程数量,当达到限制数量时,新的线程通过条件变量等待,当有线程离开方法时,通知等待的线程。例如,设置核心线程数和最大线程数为相同的值,就可以限制同时执行任务(访问方法)的线程数量。以上详细介绍了线程池使用场景中涉及的CountDownLatch、Future相关内容,以及控制方法并发访问线程数量的多种方式,并通过丰富的代码示例进行了说明。方法的线程会被阻塞,直到计数器的值变为0,此时所有等待的线程会被释放继续执行。方法),使用完后释放许可证(调用。

2025-04-26 17:11:17 868

原创 线程池(五):线程池使用场景问题

可以使用一个计数器来记录当前正在访问方法的线程数量,当达到限制数量时,新的线程通过条件变量等待,当有线程离开方法时,通知等待的线程。例如,设置核心线程数和最大线程数为相同的值,就可以限制同时执行任务(访问方法)的线程数量。以上详细介绍了线程池使用场景中涉及的CountDownLatch、Future相关内容,以及控制方法并发访问线程数量的多种方式,并通过丰富的代码示例进行了说明。方法的线程会被阻塞,直到计数器的值变为0,此时所有等待的线程会被释放继续执行。方法),使用完后释放许可证(调用。

2025-04-26 17:10:26 591

原创 线程池(四):并发编程常见问题解析

同时,也可以实现一些简单的监控机制,定期检查线程的状态和资源占用情况,当发现异常的资源等待或循环等待情况时,及时报警提示可能存在死锁风险。如果发生死锁,它会自动检测并在界面上显示出死锁的相关信息,包括死锁的线程、线程等待的资源等,方便开发者定位和分析问题。存在一个进程或线程资源的循环链,链中的每个进程或线程都在等待下一个进程或线程所占用的资源。比如线程A等待线程B占用的资源,线程B又等待线程C占用的资源,而线程C等待线程A占用的资源,形成一个循环等待的局面。资源不能被共享,只能由一个进程或线程占用。

2025-04-26 17:09:35 659

原创 线程池(三):深入理解CAS、volatile与AQS

概述:CAS是一种无锁的原子操作机制,它是实现并发控制的重要手段。在多线程环境下,传统的加锁方式(如使用关键字)会带来线程阻塞、上下文切换等开销,而CAS提供了一种更轻量级的并发处理方式。它的核心思想是在不使用锁的情况下,实现对共享变量的原子更新。基本工作流程:CAS操作涉及三个操作数,分别是内存位置(V)、预期原值(A)和新值(B)。当执行CAS操作时,首先会读取内存位置V中的值,将其与预期原值A进行比较。如果内存位置V中的值与预期原值A相等,就将内存位置V中的值更新为新值B;

2025-04-26 17:07:45 908

原创 线程池(二):深入剖析synchronized关键字的底层原理

同步代码块时,会从主内存中读取共享变量的值到工作内存中。当线程执行完同步代码块释放锁时,会将工作内存中修改后的共享变量的值写回到主内存中。这样可以保证在同一时刻,只有一个线程能够对共享变量进行修改,并且其他线程能够看到最新的修改结果,从而保证了多线程环境下共享变量的可见性和一致性。重量级锁是通过操作系统的互斥量(Mutex)来实现的,线程获取和释放锁都需要进行用户态和内核态的切换,这种切换开销比较大。偏向锁是在JDK 6中引入的,它的目的是为了在只有一个线程访问同步代码块的情况下,进一步减少获取锁的开销。

2025-04-26 17:03:59 937

原创 Windows下Nacos的启动和关闭

Nacos的启动命令,首先到Nacos安装位置的bin目录中,

2025-04-25 15:01:23 121

原创 线程池(一):线程基础知识全面解析

进程:进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间、系统资源(如文件描述符、进程间通信资源等)。例如,当我们打开一个浏览器应用,操作系统会为该浏览器创建一个进程,浏览器中的各个标签页、插件等可能在这个进程内或通过其他进程协作运行。线程:线程是进程中的一个执行单元,是程序执行的最小单位。线程共享所属进程的资源,如内存空间、文件描述符等。一个进程可以包含多个线程,这些线程并发执行,提高程序的执行效率。

2025-04-09 19:16:05 1032

原创 JVM虚拟机篇(八)

替换为上一步记录的Java进程ID),查看该进程内各线程的CPU占用情况。找到占用CPU高的线程,记录其线程ID(TID)。文件,搜索十六进制的线程ID(注意字母大写),找到对应的线程堆栈信息。列数值长期较高(如超过80%甚至接近100%),且确认不是系统其他进程导致,再进一步定位Java进程。通过以上步骤,可逐步定位Java应用中CPU过高的根源,进而针对性优化代码或调整配置,解决性能问题。(以CPU使用率排序),找到占用CPU高的Java进程(可通过。替换为记录的线程ID),得到十六进制的线程ID。

2025-04-09 18:58:06 969

原创 JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

G1(Garbage-First)回收器是一种面向服务器的垃圾回收器,旨在满足高吞吐量和低停顿时间的需求。与传统回收器不同,G1将堆内存划分为大量大小相等的Region(区域),每个Region可以动态地扮演新生代或老年代的角色。G1通过维护一个优先列表,每次根据允许的停顿时间优先回收垃圾最多的Region,这也是其名称“Garbage-First”的由来。这种设计使得G1能更灵活地控制垃圾回收的停顿时间,同时提高内存的利用率和回收效率。

2025-04-09 18:57:05 1222 1

原创 JVM虚拟机篇(六):深入理解Java垃圾回收机制

GC(Garbage Collection)即垃圾回收,是Java虚拟机(JVM)提供的一种自动内存管理机制。在Java程序运行过程中,会不断创建对象,这些对象会占用堆内存空间。当这些对象不再被程序使用时,GC负责自动识别并回收这些不再使用的对象所占用的内存空间 ,让这部分内存可以被后续新创建的对象重新利用。

2025-04-09 18:55:01 768

原创 JVM虚拟机篇(五):深入理解Java类加载器与类加载机制

类加载器(ClassLoader)是Java虚拟机中负责加载类的组件。它就像是一位勤劳的搬运工,依据类的全限定名(例如),在文件系统或其他资源存储位置查找对应的字节码文件(.class文件),并将其搬运到JVM的运行时环境中。一旦字节码文件被加载进来,类加载器还会对其进行一系列的处理,包括验证字节码的合法性、为类的静态变量分配内存并初始化、将符号引用转换为直接引用等,最终在JVM的方法区中创建对应的对象来表示这个类。这个Class。

2025-04-05 22:30:01 1043 1

原创 JVM虚拟机篇(四):彻底搞懂堆栈与直接内存

老年代中的对象相对较为稳定,但当老年代内存被占满时,Full GC就会被触发,垃圾回收器会对老年代以及新生代进行全面的垃圾回收,标记并回收不再使用的对象,释放内存空间。以NIO中的文件读写操作为例,使用直接内存可以将文件数据直接映射到直接内存中,然后Java程序可以直接对这块内存进行操作,而不需要先将数据从文件读取到Java堆内存,再进行处理。栈的内存分配是自动的,随着方法的调用和结束,栈帧自动入栈和出栈,局部变量在栈帧的局部变量表中直接分配内存。每个方法在被调用执行时,都会在栈中创建一个对应的栈帧。

2025-04-05 22:14:49 1057 1

原创 JVM虚拟机篇(三):JVM运行时数据区与方法区详解

JVM运行时数据区是JVM在执行Java程序时管理内存的核心区域,它被划分为多个不同的部分,每个部分都有其特定的用途和生命周期。堆(Heap):是JVM中最大的一块内存区域,被所有线程共享。几乎所有的对象实例和数组都在堆上分配内存。堆可以进一步细分为新生代和老年代,新生代又包含伊甸园区(Eden Space)、幸存0区(Survivor 0 Space)和幸存1区(Survivor 1 Space)。

2025-04-05 22:09:19 1218

原创 JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)

Java作为一门功能强大、应用广泛的编程语言,凭借其众多优秀的特性,在软件开发的各个领域都发挥着重要作用。从企业级应用到安卓开发,从大数据处理到分布式系统构建,Java都有着深厚的应用基础和丰富的生态支持。而元空间作为Java 8及之后版本中JVM内存管理的重要改进,解决了永久代存在的诸多问题,提高了Java应用的性能和内存管理效率。深入了解Java的全貌以及元空间的原理和应用,对于Java开发者来说是不断提升技术水平、应对复杂开发场景的关键。

2025-04-05 22:06:59 1584

原创 JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解

程序计数器是JVM运行时数据区中的一个较小的内存区域,它是线程私有的。其主要作用是记录当前线程所执行的字节码指令的地址(行号)。在Java程序执行过程中,字节码指令是按照顺序依次执行的,程序计数器就像是一个指针,指向当前正在执行的字节码指令的位置。当一条指令执行完毕后,程序计数器会指向下一条要执行的指令。在多线程环境下,程序计数器的作用尤为重要。由于多个线程是并发执行的,CPU会在不同线程之间进行切换。

2025-04-05 21:56:11 755

原创 MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略

分库分表是应对 MySQL 数据库数据增长挑战的有效策略。通过垂直分库、垂直分表、水平分库和水平分表等方式,可以将数据分散到多个数据库和表中,提高系统的性能和存储能力。在实现分库分表时,需要选择合适的中间件,配置合理的路由规则,并处理好跨库跨表查询、数据一致性和数据库管理等问题。只有这样,才能确保分库分表方案的顺利实施,为系统的稳定运行和业务的持续发展提供有力保障。希望本文能够帮助你更好地理解 MySQL 分库分表技术,并在实际项目中应用该技术解决数据增长带来的问题。

2025-04-05 21:33:33 951

原创 MySQL篇(五)MySQL主从同步原理深度剖析

MySQL主从同步原理是一个复杂而又精妙的机制,它通过主库记录操作、从库获取并重放操作的流程,借助二进制日志、中继日志以及I/O线程、SQL线程等组件的协同工作,实现了主从库之间的数据同步。了解不同的复制模式以及常见问题的解决思路,对于构建稳定、高效的MySQL主从架构至关重要。随着数据库技术的不断发展,MySQL主从同步也在不断演进和优化,数据库管理员需要持续关注和学习,以更好地应用这一技术来满足业务对数据存储和处理的需求。希望通过本文的介绍,读者能够对MySQL主从同步原理有一个全面而深入的理解。

2025-04-05 21:32:52 1190

原创 MySQL篇(四)事务相关知识详解

在一个事务中执行查询操作,在事务执行过程中,由于其他事务插入了新的数据,当该事务再次执行相同的查询时,结果集发生了变化,就好像产生了“幻影”数据。不同的隔离级别决定了事务之间相互干扰的程度,比如在高并发场景下,多个事务同时操作相同数据时,隔离性可以防止数据出现脏读、不可重复读、幻读等问题。例如事务A读取某条记录,然后事务B修改并提交了这条记录,事务A再次读取时得到了不同的值。比如事务A修改了某条记录但未提交,此时事务B读取了这条被修改但未提交的记录,如果事务A回滚,事务B读取到的数据就是无效的脏数据。

2025-04-05 21:31:17 652

原创 Mysql篇(三):SQL优化经验全方位解析

通过SQL编写、建表设计、索引使用到日常维护的优化,可全面提升数据库性能。实际项目中需结合业务场景,灵活运用优化策略,不断调试以达最佳效果。

2025-04-01 16:43:39 1011

原创 MySQL篇(二): 核心知识深度聚簇解析:索引、非聚簇索引、回表查询、覆盖索引、超大分页处理、索引创建原则与索引失效场景

聚簇索引(Clustered Index)是一种特殊的索引类型,其核心特点是数据行的物理存储顺序与索引顺序完全一致。在 MySQL 的 InnoDB 存储引擎中,通常主键索引就是聚簇索引。例如,有一张users表,定义了idage INT在这个表中,id字段的聚簇索引不仅决定了数据的逻辑顺序,还决定了数据在磁盘上的物理存储顺序。数据会按照id值的大小顺序存储,形成一个 B + 树结构,叶子节点包含了完整的数据行。

2025-04-01 16:34:23 909 1

原创 MySQL篇(一):慢查询定位及索引、B树相关知识详解

索引是一种数据结构,用于快速查找数据库表中的记录。它就像一本书的目录,通过索引可以快速定位到需要的数据,而不需要遍历整个表。在MySQL中,索引存储在磁盘上(InnoDB引擎也会将常用索引加载到内存中),不同的存储引擎支持的索引类型有所不同。

2025-04-01 16:33:26 902

原创 常见集合篇(五)深入解析 HashMap:从原理到源码,全方位解读

通过对 HashMap 实现原理、put流程、属性、扩容机制、寻址算法的深入分析,以及与 HashSet、HashTable 的对比,我们全面掌握了这一数据结构的核心要点。在实际开发中,需根据场景选择合适的集合:单线程环境优先用 HashMap;需要线程安全时,可选择同步包装类或;而 HashTable 因性能问题已逐渐被替代。理解这些细节,不仅能写出更高效的代码,也能在面试中从容应对相关问题。

2025-04-01 12:01:16 1122

原创 常见集合篇(四)散列表

散列表,也叫哈希表,是根据关键码值(Key - Value)而直接进行访问的数据结构。它通过一个哈希函数,将键映射到表中的一个位置来访问记录,以加快查找速度。

2025-03-31 21:35:05 847

原创 常见集合篇(三)二叉树

如果有两个子节点,通常的做法是找到该节点右子树中的最小节点(或者左子树中的最大节点),将其值赋给要删除的节点,然后删除这个最小节点(因为这个最小节点最多只有一个子节点,删除相对容易)。在插入或删除节点后,通过旋转和变色操作,不断调整树的结构和节点颜色,确保红黑树的性质始终满足,从而保证树的高度维持在 O(logn) ,进而保证查找、插入和删除操作的高效性。红黑树是一种自平衡的二叉搜索树,它在二叉搜索树的基础上,为每个节点增加了一个表示颜色(红色或黑色)的存储位,并通过对节点颜色的约束,确保树的平衡。

2025-03-31 21:34:20 716

原创 常见集合篇(二)数组、ArrayList与链表:原理、源码及业务场景深度解析

数组是线性数据结构,在内存中占据连续空间,存储相同类型元素。随机访问高效:通过索引定位元素,时间复杂度O(1)。插入/删除复杂:可能移动后续元素,时间复杂度O(n)。

2025-03-31 21:33:35 951

原创 常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析

空间复杂度用于衡量算法在运行过程中占用的额外空间(除输入数据本身占用空间外)随数据规模的增长趋势。与时间复杂度类似,它关注的是空间占用的增长趋势,而非具体数值。在资源有限的场景中,如嵌入式系统、移动应用等,空间复杂度的分析尤为重要,能帮助开发者合理分配内存资源,避免内存溢出等问题。

2025-03-31 21:32:21 1005

原创 自己整理的十种排序算法的详解,配上例子和代码

排序算法是计算机科学的基础,广泛应用于数据处理、搜索优化等领域。本文系统梳理了 10 种经典排序算法的核心思想、时间复杂度及稳定性,并提供 Java 代码实现。

2025-03-31 20:49:25 797

原创 深入剖析雪花算法:分布式ID生成的核心方案

雪花算法是Twitter开源的分布式ID生成算法,旨在解决分布式系统中全局唯一ID的生成问题。其核心思想是通过64位二进制数(转换为十进制约9.22亿),将时间戳、数据中心ID、机器ID和序列号等信息编码到ID中,保证ID的唯一性、递增性和可排序性。雪花算法是分布式系统中生成唯一ID的经典方案,通过合理的位分配和时钟管理,在性能、唯一性和可扩展性之间取得了良好平衡。理解其原理和实现,能帮助开发者在分布式系统设计中更好地选择ID生成策略。

2025-03-31 10:09:20 595

原创 一文读懂贪心算法与动态规划

贪心算法和动态规划是算法设计中的重要思想,各自拥有独特的应用场景和解决问题的方式。贪心算法以局部最优为导向,追求高效简洁;动态规划以记忆和递推为核心,确保全局最优。深入理解它们的原理、适用场景及区别,能帮助开发者在面对复杂问题时,准确选择合适的算法,高效解决问题。通过不断实践案例,如本文中的活动安排、斐波那契数列、最长公共子序列等,可更好地掌握这两种算法的精髓,提升算法设计与问题解决的能力。

2025-03-30 21:59:11 1123

原创 一文读懂贪心算法与动态规划

不过,并非所有问题都能通过贪心算法得到全局最优解,关键在于贪心策略的选择,所选的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。动态规划的核心思想是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。贪心算法的思路是先按照活动结束时间对活动进行排序,然后依次选择,只要当前活动的开始时间不小于上一个选择活动的结束时间,就选择该活动。数组来记录每个位置的斐波那契数,通过循环利用之前计算好的结果来递推后面的数,避免了重复计算,即便。

2025-03-30 21:40:48 1160

原创 深入剖析 JVM:从组成原理到调优实践

JVM 作为 Java 程序的核心运行环境,深入理解其组成、类加载机制、垃圾回收原理及调优方法,能帮助开发者更好地优化程序性能,解决运行时问题,打造高效稳定的 Java 应用。JVM(Java Virtual Machine)是 Java 程序运行的基础环境,其核心组成可分为三大模块:内存结构、执行引擎、本地方法接口。JDK 8 后,方法区由元空间(Meta Space)实现,使用本地内存,避免了 “永久代” 的内存溢出问题。:线程私有,存储方法执行时的栈帧,包括局部变量表、操作数栈、动态链接等。

2025-03-30 21:30:23 1239

原创 微服务核心知识点深度解析:从组件到架构设计

定义策略类:继承,重写choose方法,编写自定义逻辑。java@Override// 自定义逻辑:如根据服务实例标签筛选// 遍历筛选实例,返回目标 Server配置策略:通过配置类将自定义策略注入容器。java@Bean指定策略:在中通过指定配置类。java// 接口定义。

2025-03-30 12:23:53 1041 1

原创 在用redis当中可能遇到的问题解决方案以及redis中的一些名词解释

是由于主节点和从节点的sentinel处于不同的网络分区,使得sentinel没有能够心跳感知到主节点,所以通过选举的方式提升了一个从节点为主,这样就存在了两个主节点,导致客户点在老地节点那边写数据,新节点无法同步数据,当网络恢复后,sentinel会将老的主节点将为从节点,这是再从新的master同步数据,单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离,一般都是一主多从,主节点负责写数据,从节点负责读数据。

2025-03-27 16:21:02 874

原创 优化MyBatis-Plus批量插入策略

首先,确保你的项目中已经添加了 MyBatis-Plus 和 MySQL 驱动的依赖。为每个属性提供了对应的 getter 和 setter 方法,这里使用了 Lombok 的 @Data 注解来自动生成这些方法。调用 UserMapper 的 insertBatchSomeColumn 方法进行批量插入,并打印插入的行数。是一种用于批量插入部分列数据的插入策略,它可以帮助我们在批量插入数据时只插入部分需要的列,而不是插入所有列。它继承了Abstractmethod类,在 MyBatis-Plus 中,

2025-03-27 15:13:13 1047

原创 RabbitMQ 技术详解:异步消息通信的核心原理与实践

:跨数据中心消息传输RabbitMQ 通过灵活的路由机制、可靠的消息传递和强大的扩展性,成为分布式系统中不可或缺的通信组件。掌握其核心原理和最佳实践,能够有效提升系统的可扩展性、可靠性和性能。在实际应用中,需要根据具体业务场景选择合适的消息模型和配置策略,确保消息队列的高效稳定运行。

2025-03-26 22:42:16 1405

原创 在java开发项目中内存泄漏的五大原因,遇到内存泄漏我们该怎么做,怎么避免内存泄漏

​内存泄漏(Memory Leak)是指程序在申请内存后,无法释放已不再使用的内存的情况。通俗来说,就是程序中某些对象已经不再被使用,但由于某些原因仍然被其他对象引用,导致垃圾回收器(Garbage Collector)无法将它们从内存中回收,最终造成内存资源浪费的现象。内存泄漏的本质是对象的生命周期管理不当。在 Java 等具备自动垃圾回收机制的语言中,对象的创建和销毁由系统自动管理,但如果代码中存在不合理的引用关系,会导致对象无法被及时回收,从而占用内存空间。

2025-03-25 18:00:33 2046

原创 (23种设计模式详解)java中为什么要用设计模式,有什么作用,怎么实现

设计模式是软件开发中的通用解决方案,通过封装最佳实践提升代码的可维护性与扩展性。本文深入解析 23 种经典设计模式中的核心成员创建者模式,结构型模式,行为型模式,设计模式是软件开发中的通用解决方案,通过封装最佳实践提升代码的可维护性与扩展性。本文深入解析 23 种经典设计模式中的核心成员

2025-03-24 16:09:31 1042

空空如也

空空如也

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

TA关注的人

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