
java开发技术
文章平均质量分 88
本专栏旨在系统性梳理和分类Java开发中的核心技术与实战应用,帮助初中高级开发者构建全面的技术知识体系,提升工程能力与架构视野。
DataLu
面向对象,面向世界
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java 系统卡顿 / 卡住 / CPU 飙高:完整分析方式 + 实战案例解析
本文针对Java系统常见的卡顿、死锁和CPU飙高问题,提供了一套完整的分析方法和实战案例。主要分析工具包括jstack、jstat、jmap和MAT,通过逐步排查GC情况、线程状态和内存使用来定位问题根源。 实战案例模拟了CPU飙高场景,通过4个线程的无限循环计算触发问题,并使用top、jstat、jstack和VisualVM等工具逐步分析。最终确定是计算密集型任务导致CPU占用过高,并提出了优化建议。 文章还汇总了6类常见性能问题的表现和分析方法,包括计算密集型任原创 2025-06-02 11:39:00 · 921 阅读 · 0 评论 -
系统性地梳理Java GC日志
Java GC日志分析与内存泄漏排查指南 GC日志记录了JVM垃圾回收的关键信息,包括回收时间、内存变化、收集器类型等,是排查内存问题的重要工具。JDK8及之前版本可通过-XX:+PrintGCDetails开启日志,JDK9+则采用Xlog参数。日志分析需关注GC频率、停顿时间、内存回收效果等指标,特别是Full GC频繁、老年代持续增长、内存回收不彻底等现象,往往暗示内存泄漏。通过实际案例演示,可观察到从初期正常回收,到中期对象晋升老年代,最终Full GC频繁但内存居高不下的典型泄漏特征。结合GCVi原创 2025-06-02 11:25:47 · 807 阅读 · 0 评论 -
ThreadLocal原理
摘要: ThreadLocal是Java提供的线程本地存储机制,每个线程拥有独立的变量副本,避免线程间共享问题。其核心原理是每个线程维护一个ThreadLocalMap,以ThreadLocal实例为弱引用Key存储值。关键方法包括set()、get()和remove(),其中remove()用于防止内存泄漏。完整示例展示了多线程环境下ThreadLocal的隔离特性:主线程初始值为0,线程A和B分别设置值100和200,最终各线程独立读写且清理资源。通过ThreadLocal.withInitial()设原创 2025-06-02 11:17:44 · 1150 阅读 · 0 评论 -
ThreadPoolExecutor.shutdown()方法的流程逻辑
线程池 shutdown() 方法详解 ThreadPoolExecutor.shutdown() 方法用于有序关闭线程池: 1️⃣ 状态转换:将线程池状态从 RUNNING 改为 SHUTDOWN,不再接收新任务 2️⃣ 中断空闲线程:通过 interruptIdleWorkers() 中断等待任务的线程 3️⃣ 后续处理:调用 tryTerminate() 检查是否所有任务/线程已完成,最终进入 TERMINATED 状态 关键区别 📌 ▪ shutdown():继续执行队列任务,不中断运行中线程 ▪原创 2025-06-02 10:54:43 · 850 阅读 · 0 评论 -
ThreadPoolExecutor.execute(Runnable command) 方法的完整执行流程
本文详细解析了 ThreadPoolExecutor.execute(Runnable command) 方法的完整执行流程。该方法通过 ctl 状态变量判断线程池运行情况,按照核心线程数→任务队列→非核心线程的顺序处理任务提交。当核心线程未满时直接创建线程执行任务;否则尝试入队,并在队列满后尝试创建非核心线程。若所有途径均失败,则触发拒绝策略。源码分析展示了状态检查、线程创建、队列管理和拒绝处理的关键逻辑,并附流程图说明整体控制流程。该方法体现了线程池"核心线程优先→队列缓冲→弹性扩容→拒绝保护原创 2025-06-02 10:45:06 · 941 阅读 · 0 评论 -
基于对象大小的队列
摘要:本文提出一种基于对象字节大小的阻塞队列(SizeBasedBlockingQueue),用于解决传统队列按元素个数控制内存的不足。该方案通过装饰器模式封装原生队列,使用jol-core工具动态计算对象内存占用,在put/take操作时维护原子计数器,当超过最大字节阈值时自动阻塞生产者线程。设计包含完整类结构、流程图和代码实现,支持自定义对象大小估算策略,适用于数据库迁移等需要精确控制内存缓存的场景。(149字)原创 2025-06-01 22:55:57 · 828 阅读 · 0 评论 -
Java 内存控制框架设计与实现方案
《Java 内存监控框架设计与实现》 摘要:本文介绍了一个低侵入式的Java内存监控框架MemoryMonitor,主要功能包括:1)实时监控JVM堆内存使用情况;2)跟踪集合类(Map/List/Set)的大小和内存占用;3)检测大对象并报警;4)支持Prometheus监控和Web UI展示。该框架采用模块化设计,包含内存采样模块(MemorySampler)、集合监控中心(CollectionMonitor)、对象大小估算工具(ObjectSizeUtil)和报警系统(MemoryAlertSyste原创 2025-06-01 22:40:35 · 806 阅读 · 0 评论 -
基于生产者-消费者模式的框架,用于顺序读取 MySQL Binlog文件
本文介绍了一个基于生产者-消费者模型的binlog处理系统架构设计。系统由三个核心模块组成:BinlogReader作为生产者顺序读取binlog文件并解析事件;BlockingQueue作为缓冲队列实现模块解耦;BinlogProcessor作为消费者多线程处理事件。架构具备顺序读取、多线程消费、扩展性强等特点,支持未来接入Kafka等消息中间件。文中还提供了详细的流程图和Java代码实现,包括事件封装类、生产者、消费者以及主程序的完整代码结构,展示了binlog从读取到处理的完整流程。原创 2025-06-01 22:23:38 · 739 阅读 · 0 评论 -
socketTimeout(即 readTimeout)详解
摘要: 本文详细解析了数据库访问中的 socketTimeout(即 readTimeout)概念,它是客户端等待数据库返回数据的最大时间,若超时则抛出异常。文章通过流程图和代码示例说明其在数据库交互中的位置与作用,并与 connectTimeout、queryTimeout 对比区分。 关键点包括: socketTimeout 控制客户端接收数据的时间,适用于查询结果传输或网络延迟场景; 其与数据库执行时间(queryTimeout)和连接建立时间(connectTimeout)相互独立; 结合实际案例(原创 2025-06-01 22:13:39 · 1178 阅读 · 0 评论 -
connectTimeout vs queryTimeout vs socketTimeout 详解
摘要:本文详细解析了数据库连接中的三种关键超时机制:connectTimeout(连接超时)、queryTimeout(查询超时)和socketTimeout/readTimeout(网络读取超时)。通过对比表格展示核心区别,用餐厅点餐的比喻形象说明三者的作用差异,并绘制JDBC请求流程图展示超时触发阶段。文章包含完整的Java代码示例模拟各种超时场景,分析每种超时的具体表现和异常输出。最后对比了不同数据库的超时支持情况,并给出实际开发中的配置建议。三种超时机制分别保护"连接建立→SQL执行→结果原创 2025-06-01 21:08:41 · 806 阅读 · 0 评论 -
Java 应用中常见的各种“超时”机制详解
Java应用中的超时机制详解:文章系统梳理了各类超时场景及配置方式,包括数据库(连接/查询/事务超时)、网络(Socket/HTTP超时)、并发(线程/锁/Future超时)以及微服务/RPC等场景。重点分析了超时原理、配置方法(通过JDBC、Spring、HttpClient等方式)和典型异常处理,并提供了最佳实践建议。所有超时机制的核心目标在于保护系统资源,防止慢请求影响整体性能,开发者应根据业务场景合理设置不同层级的超时参数。原创 2025-06-01 20:58:31 · 729 阅读 · 0 评论 -
ConcurrentHashMap原理与核心源码详解
📌 Java 并发编程:ConcurrentHashMap 核心解析 ConcurrentHashMap 是线程安全的哈希表实现,采用 数组+链表/红黑树 结构,通过 CAS+synchronized 实现高效并发(JDK8)。与 HashMap 相比,它支持并发扩容、禁止 null 键值,锁粒度更细(桶级别)。JDK8 优化了 JDK7 的分段锁机制,引入红黑树提升查询效率。核心方法如 put() 通过 synchronized 锁定头节点,get() 无锁读取。适用缓存、计数器等高并发场景,需注意键值原创 2025-06-01 20:45:43 · 989 阅读 · 0 评论 -
BlockingQueue 原理与 ArrayBlockingQueue 核心源码详解
摘要: BlockingQueue是Java并发包中支持阻塞操作的队列接口,常见实现包括ArrayBlockingQueue(数组结构、有界)、LinkedBlockingQueue(链表结构、可选有界)和PriorityBlockingQueue(优先级排序)。以ArrayBlockingQueue为例,其通过ReentrantLock和两个Condition(notEmpty/notFull)实现线程安全,采用环形数组存储数据,put()方法在队列满时阻塞生产者线程,take()在队列空时阻塞消费者线程原创 2025-06-01 20:33:51 · 847 阅读 · 0 评论 -
线程池的源码流程讲解
本文通过一个完整的ThreadPoolExecutor示例,系统讲解了线程池的工作原理。从任务提交、线程创建、任务队列管理,到拒绝策略和线程回收,配合源码解析和流程图,清晰展现了线程池的运行机制。示例中:任务0-1直接分配线程,任务2-3进入队列,任务4-5扩容线程,任务6-7被拒绝。最终核心线程保持活跃,非核心线程空闲回收。整个过程覆盖了线程池的核心状态变化和执行逻辑,是理解Java线程池的绝佳实践案例。原创 2025-06-01 20:11:15 · 953 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、ReentrantLock 和 Semaphore完整的AQS队列流程图
本文介绍了四种基于AQS的同步器的实现流程与简化版模拟代码: AQS核心结构:通过简化版SimpleAQS类展示了队列同步器的基本框架,包括状态管理、CLH队列和线程阻塞/唤醒机制。 四种同步器分析: CountDownLatch:使用state作为计数器,countDown()递减至0时唤醒等待线程 CyclicBarrier:通过Condition队列实现线程屏障,达到指定数量后全部唤醒 ReentrantLock:state记录持有锁次数,非公平竞争锁资源 Semaphore:state表示可用许可数原创 2025-06-01 19:50:52 · 440 阅读 · 0 评论 -
以CyclicBarrier为例详述AQS底层的流转过程
本文通过两个线程调用CyclicBarrier.await()的示例,详细分析了AQS(AbstractQueuedSynchronizer)在CyclicBarrier中的底层实现机制。文章首先回顾了AQS的核心组件,然后分五个阶段图解了线程状态流转过程:初始状态→T1调用await()进入等待→T2调用await()触发唤醒→T1被唤醒→T2被唤醒。整个过程展示了Condition队列与CLH同步队列之间的转换,以及state值的变化。总结中归纳了AQS在CyclicBarrier中的关键作用机制,并提原创 2025-06-01 19:36:50 · 864 阅读 · 0 评论 -
CyclicBarrier的线程流转图
本文深入解析了CyclicBarrier的实现机制及其底层AQS原理。CyclicBarrier通过ReentrantLock和Condition实现线程同步,核心流程包括线程等待、屏障触发和唤醒机制。AQS作为基础同步框架,采用CLH队列管理线程状态,支持公平/非公平锁策略。文章详细对比了CyclicBarrier、CountDownLatch和Semaphore的特性差异,并提供了源码分析和调试建议。通过两个线程的状态流转示例,直观展示了CyclicBarrier与AQS的协作原理。原创 2025-06-01 19:30:25 · 866 阅读 · 0 评论 -
AbstractQueuedSynchronizer (AQS) 原理详解
AQS是Java并发包的核心组件,用于实现锁和同步器。它通过CLH队列管理等待线程,支持独占和共享两种模式,提供获取/释放锁的模板方法。ReentrantLock、CountDownLatch等工具类都基于AQS实现。AQS采用自旋优化和队列优化策略,兼顾性能和公平性。开发者可通过继承AQS自定义同步器,但需注意避免死锁和性能问题。理解AQS是掌握Java并发编程的关键。原创 2025-06-01 17:20:42 · 910 阅读 · 0 评论