- 博客(30)
- 收藏
- 关注

原创 基于FRP工具在Windows电脑上的Linux云服务器实现星露谷物语远程稳定联机
云服务器是一种基于云计算技术的虚拟服务器,提供计算资源、存储和网络功能。相比传统的物理服务器,云服务器具有高可用性、弹性扩展和成本效益等优势。
2024-10-14 14:03:01
1776
3
原创 IO多路复用
这个轮询器会有一个线程,里面一直不断的轮询,不断地查询这些通道的状态,看看有没有可连接的状态,不断地循环查找,当找到一个是连接状态的了,就把这个是连接状态的通道拿出来,改成监听是否可读状态,再注册到轮询器上,注册后继续轮询找,当找到一个是可读状态的channel那么就可以直接读取数据了,这样其他的客户端就不需要像BIO那样,需要等之前的客户端请求完全执行完了才能轮到自己,只要哪个客户端的事件状态有变化了,就会被循环查找到执行对应的操作了。现在确实让内核来遍历这些通道的状态了。具体分为以下几个步骤。
2025-04-01 20:30:36
741
原创 HashMap、HashTable 与 ConcurrentHashMap 的区别
【代码】HashMap、HashTable 与 ConcurrentHashMap 的区别。
2025-03-30 15:36:20
997
原创 深入解析 HotSpot 的经典垃圾收集器
Serial 收集器是 HotSpot 虚拟机中历史最悠久、最基础的垃圾收集器。在 JDK 1.3.1 之前,它曾是新生代收集器的唯一选择。顾名思义,Serial 收集器以单线程方式工作,在进行垃圾收集时会暂停所有其他用户线程,即所谓的“Stop The World”。ParNew 收集器可以看作是 Serial 收集器的多线程并行版本。
2025-03-29 13:25:01
903
原创 深入理解 HotSpot 垃圾收集算法的细节实现
虽然抢先式中断和主动式中断都要求线程最终在安全点处停下,但抢先式中断由系统直接强制中断线程,而主动式中断则依赖线程主动检测全局中断标志并挂起。由于抢先式中断可能在不安全状态下中断线程,现代 JVM(如 HotSpot)均采用主动式中断。
2025-03-27 10:18:45
636
原创 深入理解垃圾收集算法:从分代理论到经典回收策略
分代收集理论奠定了现代垃圾收集器的设计基础,通过将堆划分为新生代和老年代,实现了针对不同对象生命周期的“对症下药”。各类垃圾收集算法(标记-清除、标记-复制、标记-整理)各有优缺点,设计者往往需要在停顿时间、内存利用率、吞吐量之间做权衡。未来趋势:随着硬件技术和应用需求的发展,诸如 ZGC、Shenandoah 等新一代垃圾收集器正尝试在全区域收集模式下实现更低延迟和更高吞吐量,这将对传统分代模型提出挑战或改进。
2025-03-26 22:33:23
1057
原创 JVM 为什么不使用引用计数算法?——深入解析 GC 策略
在 Java 中,垃圾回收(Garbage Collection, GC)是一个至关重要的功能,它能够自动管理内存,回收不再使用的对象,从而防止内存泄漏。然而,在垃圾回收的实现上,JVM 并未采用引用计数算法(Reference Counting),而是使用了可达性分析算法(Reachability Analysis)。那么,为什么 JVM 选择可达性分析,而不是引用计数?这篇文章将深入探讨引用计数的原理、局限性,以及 JVM 采用可达性分析的原因。引用计数是一种简单且高效的垃圾回收策略,它的核心思想是:每
2025-03-26 18:24:59
1444
原创 深入解析 JVM 内存区域及核心概念
程序计数器是一块非常小的内存区域,主要功能是记录当前线程正在执行的字节码指令的地址,相当于程序中的“行号指示器”。每次递归调用都会在 JVM 栈中创建一个新的栈帧,当递归深度超过 JVM 所分配的栈内存时,就会抛出栈溢出错误。这些条目显示了类中存在的各种字面量、符号引用等信息,是 JVM 在加载类时用来解析并建立直接引用的重要依据。:管理方法调用时产生的栈帧,包含局部变量、操作数栈等数据,代码示例展示递归调用导致栈溢出的情形。:本地方法栈专门处理本地代码,而 JVM 栈用于执行 Java 字节码。
2025-03-26 17:59:13
1115
原创 对象的创建
JVM 需要为对象设置「它是哪个类的实例、如何找到类元数据、对象的哈希码、GC 分代年龄、锁标志位」等信息,这些都放在对象头(Object Header)中。:为每个线程预先在堆中分配一小块缓冲区(TLAB),这样每个线程只在自己的 TLAB 中分配对象,只有当 TLAB 用完后才需要同步锁定分配新的缓冲区。上面步骤完成后,从 JVM 角度看,对象已经生成了,但对于 Java 程序来说,构造方法还没执行,字段值只是默认值。若堆中空闲内存是连续的,一边放已使用的内存,一边放空闲的内存,中间是一个分界指针。
2025-03-25 15:49:12
365
原创 ArrayDeque注意不要搞混
是 Java 提供的实现,它既可以用来模拟(FIFO)也可以用来模拟(LIFO)。要弄清它的headtailheadtail你可以把它当成用时,就约定进出即可。例如pushpop,或者offerLastpollLast。
2025-03-19 11:05:28
531
原创 什么是索引下推
从 Server 层下推到存储引擎层,使得存储引擎在回表前就能过滤掉不符合条件的记录,从而减少回表次数和 IO 开销。:存储引擎层提前过滤无效数据,减少回表次数和 Server 层负载。不符合条件,仍需回表获取完整数据,导致大量无效 IO。查看执行计划,若出现。
2025-03-03 00:26:27
494
原创 WatchDog 看门狗
watchdog机制的关键作用是保障系统的可用性和稳定性,尤其是在分布式系统和多进程环境中。通过监控关键服务、进程或资源的状态,及时发现故障并采取措施(如重启、恢复、报警等),watchdog可以大大提高系统的鲁棒性,减少服务的中断时间。
2025-03-01 21:48:45
479
原创 在分布式系统中,解决因锁持有者故障导致锁无法释放的问题
在分布式系统中,如果锁的持有者因故障无法主动释放锁,可能会导致死锁或业务阻塞。为了提高系统的稳定性和可用性,需要结合自动释放机制和容错设计。为锁设置一个超时时间(TTL),如果持有者未主动释放,锁将在超时后自动失效,避免死锁。,即使某个 Redis 节点宕机,仍能正常获取锁。✅ 避免长任务执行过程中,锁因超时自动释放,导致。,防止任务执行时间过长导致锁提前释放。,防止因锁误释放导致的数据不一致问题。:防止误删其他客户端持有的锁,使用。,防止误删导致多个客户端持有锁。导致的锁无法释放问题,确保。
2025-03-01 21:45:41
811
原创 Mysql的索引失效
尽量避免在索引列上直接使用函数、表达式或进行运算;如果需要,请考虑使用生成列和函数索引(MySQL 8.0 以后支持)。保持数据类型一致:确保查询条件的常量类型与表中列的类型一致,避免隐式转换。优化 LIKE 查询:尽量使用前缀匹配(如),而不是左模糊(联合索引设计:使用联合索引时遵循最左匹配原则,设计时考虑最常用的查询条件。谨慎使用 OR 与否定条件:确保 OR 条件中的所有子条件都能利用索引,或尝试改写查询逻辑。合理估算返回数据量。
2025-03-01 21:33:45
569
原创 怎么排查页面响应慢的问题
根据历史流量数据及QPS(每秒查询数)增长趋势,预留30%额外资源缓冲。定期进行全链路压测,类似阿里双11的负载测试方式,确保系统高并发下仍能稳定运行。:Arthas热诊断、Async Profiler、火焰图(Flame Graph)工具实时监控各个环节的性能瓶颈。
2025-03-01 21:26:41
943
原创 SpringBoot的事务失效
Spring Boot 中的事务失效通常是由于代理机制、异常处理、传播行为配置不当等原因引起的。通过合理配置和排查,可以有效避免事务失效问题。确保方法是通过 Spring 代理调用的。正确处理异常,保证事务回滚。合理配置事务传播行为,以满足不同的业务需求。确保数据库支持事务,例如使用 InnoDB。
2025-02-25 23:16:00
820
原创 Java内存模型(JMM)
一、Java内存模型(JMM)的抽象结构JMM 主要定义了线程与内存之间的交互规则,其目标是解决多线程并发中的可见性有序性和原子性问题。
2025-02-24 00:44:26
696
原创 一文详解Synchronized
当一个对象被加锁了,但在实际运行时,只有一条线程会获取这个对象锁,那么我们最理想的方式是,不通过系统状态切换,只在用户态完成这件事。偏向锁能够认识这个线程,只要这个线程过来,那么对象就直接把锁交给它,我们可以认为这个对象锁偏爱这个线程,因此被称为“偏向锁”。此时,获取对象锁的线程可以执行任务。例如,如果一个线程之前成功获得过锁,但现在锁被其他线程持有,那么虚拟机会认为下次自旋可能会再次成功,允许更长的自旋时间。指令时,会把计数器减 1,当计数器值为 0 时,锁释放,处于等待队列中的线程再继续竞争锁。
2025-02-20 00:26:56
986
原创 既然偏向锁是在无竞争条件下的,为什么不直接无锁呢?
偏向锁提供了一种在单线程和没有竞争的情况下高效、低开销的锁机制,它不仅可以减少获取锁的开销,还能为未来多线程竞争的情境做准备。偏向锁是为了平衡性能和可扩展性,它避免了完全无锁带来的复杂性和不稳定性,同时也保持了在单线程执行时的低开销。
2025-02-19 22:00:55
258
原创 几种单例模式
饿汉式:线程安全,但会在类加载时就创建实例,浪费资源。懒汉式:延迟加载,避免资源浪费,但线程不安全。线程安全的懒汉式:使用保证线程安全,但性能较差。双重检查锁:优化了线程安全,避免了每次加锁,但代码较复杂。静态内部类:推荐的单例实现方式,线程安全且性能高。根据实际需求选择合适的单例实现方式。通常推荐使用静态内部类实现单例,因为它既线程安全又高效。
2025-02-18 01:01:36
391
原创 一看就懂的类加载过程
静态变量是引用类型的,默认值为 null。被final修饰的static字段不会设置,因为final在编译的时候就分配了。System.out.println("静态代码块执行");文件的二进制字节流,并将其转换为方法区的数据结构,最终在内存中生成。:确保父类、接口、字段、方法等符合 JVM 规范。通过类的全限定名(包名+类名)获取该类的。对象,作为访问该类元数据的入口。:确保类的外部引用可以正确解析。指向方法区或堆内存的指针地址。(解析父类、实现的接口)。(堆内存不再有该类对象)。
2025-02-09 21:10:30
728
原创 一文理解布隆过滤器原理
布隆过滤器是一种高效的概率型数据结构,主要通过哈希函数和位图实现高效的元素存在性判断。它具有极高的空间效率和查询效率,广泛应用于缓存穿透防护、去重、权限管理等场景。虽然布隆过滤器可能出现误判,但通过合理的设计和优化,可以在实际应用中有效减少误判的概率。
2025-02-06 07:00:00
854
原创 缓存-双写一致性
第一次删除缓存在执行写操作时,首先删除缓存中对应的数据。这一步确保后续查询不会直接命中旧数据。修改数据库接下来,执行数据库的更新操作,将最新数据写入数据库。延迟一段时间由于数据库通常采用主从复制、读写分离等架构,从节点的数据同步会存在一定延迟。为确保所有节点的数据都更新到最新状态,需要等待一段时间(如几百毫秒到几秒钟)。第二次删除缓存在等待延迟时间后,再次删除缓存中的数据,确保从节点同步完成后缓存中不会残留脏数据。
2025-02-06 00:05:30
727
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人