自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式事务

是需要强一致性(如金融交易的核心流程)还是可以接受最终一致性?业务流程是否适合拆分为 Try/Confirm/Cancel?是否能接受补偿逻辑?系统是否需要处理极高的并发?是否有成熟的消息队列、CDC 工具,以及团队对这些技术的掌握程度?出现故障时,系统如何恢复,是否需要人工干预?在实际的分布式系统中,往往会根据业务场景的特点,混合使用多种模式来满足不同的需求。例如,核心交易路径可能使用 TCC 或 Saga,而辅助通知类功能则使用事务消息或最大努力通知。

2025-07-10 16:06:47 859

原创 OOM在哪出现,如何解决

这是最常见的 OOM 类型。使用 MAT 或 VisualVM 等工具分析堆转储文件,找出占用内存最多的对象,以及这些对象的引用链。参数关闭此限制,但强烈不推荐,因为这会导致应用程序在 GC 上花费大量时间,性能极低,只是将错误延迟,并不能解决根本问题。这表明应用程序的内存使用效率极低,GC 几乎没有效果,与其让程序继续低效运行,不如直接抛出错误。在修复后,持续监控应用程序的内存使用情况,进行压力测试,确保 OOM 不再发生。强大的堆内存分析工具,可以分析大内存文件,帮助识别内存泄漏和占用大内存的对象。

2025-07-09 10:54:34 965

原创 网页加载全过程

总而言之,输入一个简单的网址,背后涉及到复杂的网络通信、服务器处理和浏览器渲染等一系列精密的步骤,最终才将丰富多彩的网页内容展现在你的眼前。输入网页后,一系列复杂的过程会在你的计算机和互联网之间展开,最终将你请求的网页呈现在你的屏幕上。

2025-04-27 22:24:09 949

原创 HTTP协议

HTTP 协议是现代互联网的基石,它简单、灵活、可扩展,并随着技术的发展不断演进。理解 HTTP 的基本概念、特点、发展历程和报文结构,对于 Web 开发、网络管理以及理解互联网的工作方式至关重要.HTTP 是互联网上应用最为广泛的一种网络协议,用于在 Web 浏览器(客户端)和 Web 服务器之间传输数据,是万维网(World Wide Web)数据通信的基础。HTTP 报文是客户端和服务器之间通信的基本单元。

2025-04-27 21:49:01 1016

原创 Java 的类加载器(ClassLoader)

当一个类加载器收到加载一个类的请求时,它不会立即自己去加载,而是将这个请求委派给它的父类加载器,直到委派给最顶层的启动类加载器。只有当父类加载器在它的搜索范围内找不到所需的类时(即无法完成加载),子类加载器才会尝试自己去加载。类加载器是 JVM 中一个非常重要的子系统,它负责将 Class 文件(包含类的字节码)加载到 JVM 的运行时数据区(主要是方法区)中,并在堆内存中创建对应的。方法中,你需要根据类的全限定名,从特定的来源(例如加密过的 Class 文件、网络)读取类的字节码,并调用。

2025-04-27 16:12:14 493

原创 下一代垃圾收集器:ZGC 的全面解析

ZGC 作为下一代垃圾收集器的代表,凭借其创新的技术和对低延迟的极致追求,为 Java 应用在面对日益增长的数据和用户规模时提供了强有力的内存管理解决方案。随着应用规模的扩大和数据量的激增,传统的垃圾收集器在处理 TB 级甚至更大的堆内存时,往往会暴露出停顿时间过长等问题,严重影响用户体验。其主要的垃圾回收周期,包括并发标记、并发预备重分配、并发转移和并发重映射,几乎都是并发进行的,只有极短的初始标记和再标记阶段会发生 STW。将需要回收的 Region 中的存活对象复制到新的 Region 中。

2025-04-26 18:29:23 1188

原创 Java 虚拟机(JVM)中常见的垃圾回收算法

1. 标记-清除算法 (Mark-and-Sweep)2. 复制算法 (Copying)3. 标记-整理算法 (Mark-Compact)现代 JVM 中更先进的垃圾回收算法(通常是分代收集的组成部分):4. Serial 收集器5. ParNew 收集器6. Parallel Scavenge 收集器7. Serial Old 收集器8. Parallel Old 收集器9. CMS (Concurrent Mark Sweep) 收集器10. G1 (Garbage-First) 收集器11. ZGC

2025-04-26 17:00:50 641

原创 Java 内存分配和回收

Java 内存分配和回收是 Java 虚拟机 (JVM) 自动进行的关键过程,旨在有效地管理内存,防止内存泄漏,并优化程序性能。

2025-04-26 11:21:59 535

原创 Java 中类、对象、线程、Servlet 和 Spring Bean 的生命周期

【代码】Java 中类、对象、线程、Servlet 和 Spring Bean 的生命周期。

2025-04-24 20:46:55 734

原创 动态规划解题思路

掌握一套通用的解题框架能够帮助你更好地分析和解决这类问题。动态规划通常用于解决具有。

2025-04-24 10:01:37 375

原创 AbstractQueuedSynchronizer (AQS)

无论是独占模式还是共享模式,AQS 的核心操作都围绕着获取和释放同步状态展开,并涉及到线程的阻塞和唤醒以及队列的管理。包中构建锁和同步器的核心框架,理解其原理对于掌握 Java 并发工具至关重要。等都是基于 AQS 实现的,它们的行为和特性都与 AQS 的基本机制密切相关。字段以及与前驱节点的隐式连接来维护等待关系。等方法,用于实现更灵活的线程等待和通知机制。包中各种锁和同步工具的关键。内部维护着一个独立的等待队列。AQS 的等待队列是一个。是独占锁的典型实现。是共享锁的典型实现。AQS 还提供了创建。

2025-04-22 21:43:14 1202

原创 线程池(Thread Pool)

当任务队列已满且线程池中的线程数达到最大线程数时,新提交的任务会执行的拒绝策略。如果任务队列已满,并且当前线程数小于最大线程数,则会创建新的线程来执行任务。起来,当有任务需要执行时,就从线程池中获取一个空闲线程来执行,任务执行完毕后,线程不会立即销毁,而是。在并发编程中,线程池是一种非常重要的机制,用于管理和复用线程,以提高程序的性能和可管理性。当线程池中的线程数大于核心线程数时,多余的空闲线程在空闲时间达到。后会被销毁,直到线程池中的线程数减少到核心线程数。的一个核心实现类,它提供了可配置的线程池。

2025-04-21 21:53:54 1345

原创 ThreadLocal 底层原理

的核心思想是为每个线程维护一个独立的变量副本。这个机制的实现依赖于。理解这些底层细节有助于我们更好地理解。为了避免内存泄漏,及时调用。(弱引用),线程局部变量作为。方法实际上是对当前线程的。的底层原理依赖于每个。的行为和正确地使用它。(强引用)存储在这个。

2025-04-21 21:15:04 892

原创 Java 内存模型 (Java Memory Model)

如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果对第二个操作是可见的,并且第一个操作的执行顺序先于第二个操作。,它定义了 Java 程序中各种变量(包括实例字段、静态字段和构成数组对象的元素,但不包括局部变量和方法参数)的访问规则,以及在并发环境下线程如何与内存交互的抽象描述。为了实现 JMM 的规则,JVM 会在适当的位置插入内存屏障指令,以阻止特定类型的处理器重排序,并强制将缓存中的数据刷新到主内存,或者使缓存中的数据失效。

2025-04-21 16:23:56 326

原创 可以直接调用 Thread 类的 run 方法吗?

它仅仅会被当作一个普通的实例方法在。中执行,与调用任何其他对象的方法没有什么区别。因此,如果想要启动一个新的线程来执行。线程中顺序执行的,线程名都是。启动一个新的线程来执行。,并没有创建新的线程。

2025-04-20 16:04:08 334

原创 为什么程序计数器、虚拟机栈和本地方法栈是线程私有的?

这种线程私有和线程共享的设计是 JVM 为了高效地管理内存和支持并发执行而做出的重要决策。它既保证了每个线程能够独立运行,又实现了数据的高效共享。这两个内存区域主要存储的是所有线程都需要访问的数据,为了提高内存利用率和方便线程间的数据共享,它们被设计成线程共享的。这三个内存区域与线程的执行密切相关,为了保证每个线程能够独立、正确地执行代码,它们必须是线程私有的。

2025-04-20 15:21:42 593

原创 集合的遍历

Java 集合框架提供了多种遍历集合(Collection)中元素的方法。选择哪种方法取决于具体需求以及集合的类型。JDK 8 引入的 Stream API 提供了一种更强大和灵活的方式来处理集合数据,包括遍历、过滤、映射、排序等操作。增强型 for 循环是 JDK 5 引入的一种更简洁的遍历集合和数组的方式。它在底层仍然使用了迭代器。接口是 Java 集合框架的核心接口之一,它提供了一种统一的方式来遍历各种集合。

2025-04-20 14:14:49 958

原创 HashMap 在 Java 中常见的遍历方式

这是最常用且效率较高的方式,因为它允许你同时访问键和值。JDK 8 引入了 Lambda 表达式,使得遍历。中的所有键,可以使用这种方式。中的所有值,可以使用这种方式。

2025-04-20 13:48:54 469

原创 HashMap 在多线程环境下为什么不安全

它通过分段锁(JDK 1.7)或 CAS + synchronized(JDK 1.8)等机制来实现线程安全,并在保证并发性能的同时提供了数据的正确性。如果需要在多线程环境下使用键值对存储,可以考虑使用线程安全的。

2025-04-20 13:43:12 514

原创 ArrayList 和 CopyOnWriteArrayList 在底层实现上的关键差异

【代码】ArrayList 和 CopyOnWriteArrayList 在底层实现上的关键差异。

2025-04-20 13:09:37 456

原创 语法糖(Syntactic Sugar)

它通过在底层转换为更基础的代码,使得程序员能够以更简洁、更易读的方式表达复杂的逻辑。虽然语法糖本身不增加语言的功能,但它能够显著提高代码的可维护性和开发效率。理解语法糖的原理有助于我们更好地理解语言的特性以及编译器或解释器的工作方式。从本质上讲,语法糖就像是编译器或解释器提供的一种“甜味剂”,它在底层会被转换成更加基本的、没有这种便利语法的等效代码。程序员可以使用更简洁的语法来表达复杂的逻辑,而无需关心底层的转换细节。这种语法虽然不会引入新的功能,但能够使代码更加简洁、易读,并且有时也能减少代码的编写量。

2025-04-18 21:37:46 1217

原创 JDK 代理和 CGLIB 代理

代理对象通常与真实对象实现相同的接口,并在调用真实对象的方法前后执行额外的操作。这两种都是 Java 中实现动态代理的常用方式,它们允许你在运行时创建代理对象,以便在调用真实对象的方法时插入额外的逻辑,例如日志记录、性能监控、事务管理等,而无需修改原始类的代码。代理类通常会持有真实对象的引用,并在其方法中调用真实对象的方法,同时添加额外的逻辑。JDK 代理和 CGLIB 代理是 Java 中实现动态代理的两种主要方式,各有优缺点。Java 提供了两种主要的动态代理机制:JDK 代理和 CGLIB 代理。

2025-04-18 11:24:19 1159

原创 回调函数、文件描述符和 Socket

它是操作系统内核为了管理被打开的文件、套接字(sockets)、管道(pipes)或其他 I/O 资源而分配给每个进程的唯一标识符(handle)。接口),当操作系统完成 I/O 操作后,会调用你的回调函数,并将结果(例如,读取的字节数、写入的字节数)和任何相关的上下文信息传递给它。这三个概念在不同的 I/O 模型中扮演着重要的角色,理解它们是进行高效 I/O 编程的关键。中,回调函数是至关重要的。当外层函数执行完毕或某个特定事件发生时,它会“回调”执行作为参数传入的函数。回调函数,简单来说,就是一个。

2025-04-17 22:07:31 920

原创 Java 中的 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及 IO 多路复用

虽然读写操作本身可能是阻塞的(在数据真正就绪后),但由于只有一个或少数几个 Channel 是就绪的,因此整体的并发性能得到了提升。I/O 模型描述了应用程序如何在操作系统内核的帮助下进行数据传输(例如,从磁盘读取数据、通过网络发送数据等)。不同的 I/O 模型在数据就绪、数据拷贝等阶段的处理方式上有所不同,从而影响应用程序的性能和并发能力。应用程序可以将多个文件描述符(例如,Socket)注册到这些系统调用中,然后等待其中任何一个描述符发生 I/O 事件(例如,有数据可读、可以写入数据、连接建立等)。

2025-04-17 21:26:57 932

原创 从字节码的角度深入分析 try-catch-finally 这个 语法糖背后的实现原理

块中的清理代码总能得到执行。理解这一点有助于我们更好地理解 Java 异常处理的底层机制以及编写更健壮的程序。理解这一点有助于我们更清晰地认识异常处理在 JVM 层面是如何运作的。块中的代码都保证会被执行(除非 JVM 突然崩溃等极端情况)。块的保障执行是通过在所有可能的控制流出口处都插入对。块的范围以及不同异常情况下程序执行的跳转目标(语法的核心实现依赖于 Class 文件的。块代码的执行来实现的。块中的代码正常执行完毕,会接着执行。不匹配的异常,这个异常不会被当前的。块中的代码,然后正常返回。

2025-04-16 16:50:55 1014

原创 如何解决哈希冲突详细说明

解决哈希冲突是设计高效哈希表的关键。当不同的键(key)通过哈希函数计算得到相同的哈希值(hash value 或 hash code),就需要采取特定的策略来处理这些冲突,以保证数据的正确存储和高效检索。在 JDK 8 之后,当链表长度超过一定阈值时,会将链表转换为红黑树,以提高在严重冲突情况下的查找效率。在实际的哈希表实现中,通常会结合多种策略来优化性能。也会根据负载因子进行动态扩容(再哈希)。

2025-04-16 16:28:56 1034

原创 静态方法不能直接调用非静态成员

由于静态方法在类加载时就存在,并且不属于任何特定的对象实例,因此它无法直接访问那些只有在对象创建后才存在的非静态成员。静态方法就像查看蓝图上的通用说明。它在房子被建造之前就存在了,所以它不可能直接知道任何特定房子里的家具或功能。你可以把类比成一个蓝图(类)和根据蓝图建造的房子(对象)。

2025-04-16 14:56:23 453

原创 Bean的底层实现机制(详细)

这些机制共同协作,使得 Spring 能够以声明式的方式管理应用程序中的对象,降低了组件之间的耦合度,提高了应用程序的可维护性和可测试性。Spring IoC 容器是整个 Bean 管理的核心,它负责协调和控制 Bean 的整个生命周期。在 Spring 框架中,“Bean” 的底层实现机制是一个复杂但核心的概念,它涉及到 Spring IoC (Inversion of Control,控制反转) 容器如何创建、管理和维护应用程序中的对象。

2025-04-16 12:54:21 966

原创 多态底层原理

多态 = 父类引用指向子类对象 + 方法调用在运行时动态绑定编译期只检查方法是否存在(基于父类类型)运行时通过对象实际类型的 vtable 找到真正的方法地址调用的是子类重写后的方法(实现动态绑定)

2025-04-15 21:42:29 945

原创 回溯(Backtracking)和深度优先搜索(DFS, Depth-First Search)

DFS是一种纯粹的遍历方法,适用于不需要剪枝的图遍历。回溯是 DFS 的一种扩展,通常会在遍历过程中剪枝,避免重复的或者不可能成功的路径。回溯的重点在于“尝试-撤销”操作。两者常常在处理组合、排列、路径问题时一起使用。

2025-04-14 20:24:11 1094

原创 回溯算法中的used[] 和 startIndex

用法startIndexused[]适用问题子集、组合(顺序无关)全排列(顺序有关)控制作用控制从当前位置向后遍历,防止回头控制当前元素是否已经被使用是否可以选当前元素❌ 不能再选之前的✅ 允许选任意位置未被使用的元素是否保证顺序✅ 默认按输入顺序❌ 每个顺序都试一次。

2025-04-14 10:44:15 385

原创 Spring Boot 自动配置原理

↓↓↓读取 spring.factories 中的配置类↓每个类根据条件注解判断是否加载↓满足条件的类被注册为配置类↓其中的 @Bean 方法注入到 Spring 容器条件判断 + 配置类注册 + 按需注入 Bean = 自动帮你配置一切。

2025-04-13 23:52:19 1359

原创 spring和springboot

特点说明起步依赖(Starter)像一行就能导入 Web 所需组件自动配置Spring Boot 会自动根据你引入的库,推测你要的配置内嵌服务器可以直接运行,不需要部署到外部 Tomcat配置简洁主要通过或配置Devtools 热部署修改代码自动重启应用,开发更高效Spring 提供强大框架能力,Spring Boot 帮你“把 Spring 用起来”,适合现代开发需求,搭配 Spring Cloud 更适合做微服务系统。

2025-04-13 23:50:37 756

原创 2025.04.09华为机考第三题

本题实质是将矩阵顺时针展开,转化为一维排列;操作限制为“只能与顺时针下一个交换”,变成统计逆序对;使用归并排序高效统计逆序对;,空间复杂度O(N^2);支持最大N = 1000的规模。

2025-04-13 16:04:36 496

原创 2025.04.09华为机考第二题

大湾区某城市地铁线路非常密集,乘客很难一眼看出选择哪条线路乘坐更合适。为了解决这个问题,地铁公司希望你开发一个程序,,站点是图的节点,相邻站之间的乘坐时间是边的权重。第二行是两个站点名(单个小写字母),表示出发站和终点站;数据结构用得非常清晰:邻接表、优先队列、路径回溯图。,表示站点总数(3 ≤ N ≤ 20);可扩展性强:如加上站点换乘、票价、时段等。输出乘坐时间最短的线路路径以及总耗时。,表示两个相邻站点之间的乘坐时间;最后从终点往回构建最短路径并输出。输入保证一定有唯一解。站点1 站点2 时间。

2025-04-13 15:47:06 451

原创 2025.04.09华为机考第一题

拓扑排序找最长路径的末端节点。与一般最长路径不同,我们只记录每个节点到源节点的最大深度(通过 DP 实现);最后找出所有等于最大深度的节点,按字典序输出。

2025-04-13 15:30:57 401

原创 Spring 事务 和 数据库事务

Spring 的事务其实是“数据库事务的增强版” —— 它不是取代数据库事务,而是控制数据库事务的开启与提交时机。Spring 本身并不真正执行事务的提交和回滚,而是通过底层的数据库连接(比如 JDBC Connection)去完成这些操作。Spring 事务是“上帝视角”,通过统一管理方法里的多个数据库事务,实现整体的事务性控制,而具体执行还得靠数据库自身的事务机制。

2025-04-12 21:26:22 450

原创 spring是如何解决循环依赖的?

class A {class B {你会发现:A 要创建的时候需要 B,B 又要创建 A,就这样互相依赖,形成了一个“死循环”!Spring 通过三级缓存机制(SingletonFactory -> earlySingletonObjects -> singletonObjects)解决了 setter 注入的循环依赖问题,但无法解决构造器注入的循环依赖。

2025-04-12 21:17:17 844

原创 Java反射

反射就是 Java 提供的一种机制,让你可以在运行时动态获取类的信息,并且可以创建对象、调用方法、访问属性。编译时不确定的,运行时通过类名字符串也能搞定!反射是 Java 的“万能钥匙”,让你可以在运行时操作一切类、方法和字段,但也要谨慎使用!

2025-04-12 21:06:49 347

原创 动态代理详解

动态代理就是在运行时,动态生成一个代理类,来“代理”你原本的对象,并添加一些额外逻辑。相比静态代理(你手动写一个代理类),动态代理是自动帮你生成的!System.out.println("添加用户");如果你没有接口,JDK 代理就失效了,这时用 CGLIB:它会生成一个目标类的子类,重写所有非 final 方法然后在重写方法中加入你要增强的逻辑Spring 默认使用 CGLIB,如果目标类没有接口。

2025-04-12 20:55:55 503

SCPAS-1D太阳能电池仿真软件

SCPAS-1D太阳能电池仿真软件资源描述 内容概述 SCPAS-1D(Solar Cell Performance Analysis System - 1D)是一款专注于一维(1D)太阳能电池模拟与性能分析的先进软件工具。它集成了物理学模型、数值算法和图形用户界面,旨在帮助研究人员、工程师及学生深入理解太阳能电池的工作原理、性能优化及材料特性对电池效率的影响。通过简化复杂的物理过程到一维模型,SCPAS-1D能够在保证计算精度的同时,大幅提高仿真效率,使得用户能够轻松地进行大规模参数扫描和性能预测。 适合人群 光伏材料科学家:研究新型光伏材料特性及其对电池性能影响的研究者。 太阳能电池工程师:负责太阳能电池设计、优化及制造工艺的工程师。 高等教育学生:学习半导体物理、光电转换原理及光伏技术的本科生、研究生。 科研人员:从事能源转换、光电材料等领域的基础与应用研究的学者。 能学到什么 太阳能电池基本原理:深入理解光电效应、载流子传输、复合机制等核心概念。 材料特性对性能的影响:学习不同材料(如硅、钙钛矿、有机半导体等)的带隙、迁移

2024-07-29

空空如也

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

TA关注的人

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