Java
未读
【JVM篇】Java垃圾收集详解
序言垃圾收集(Garbage Collection,下文简称GC)。程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回
【每日一问】Java线程的生命周期包括哪几种状态?
Java线程的生命周期包含六种状态:初始(NEW)表示线程已创建但未调用start();运行(RUNNABLE)涵盖操作系统的就绪和运行两种状态;阻塞(BLOCKED)是线程在资源争夺中被动挂起,等待资源释放,此时释放CPU但不释放内存;等待(WAITING)需要其他线程的特定动作(如通知或中断)才能唤醒;超时等待(TIMED_WAITING)与等待类似,但可在指定时间后自行返回;终止(TERMINATED)表示线程已执行完毕。这些状态共同管理线程的执行流程,确保资源高效利用和程序稳定性。(约120字)
【每日一问】请说说synchronized和ReentrantLock的区别?
synchronized与ReentrantLock是Java中两种锁实现,主要差异如下:实现层次上,synchronized属JVM层,ReentrantLock属JDK层;锁状态判断,synchronized无法直接判断,ReentrantLock可通过isLocked判断;公平性,synchronized是非公平锁,ReentrantLock支持公平/非公平模式;中断性,synchronized不可中断,ReentrantLock的lockInterruptibly支持中断;锁释放,synchronized异常自动释放,ReentrantLock需finally手动释放,且获取方式更灵活(如tryLock、定时等待);唤醒策略,synchronized可能让后续线程先获锁,ReentrantLock遵循先来先得。
Java
未读
【并发编程】深入理解ConcurrentHashMap
ConcurrentHashMap在HashMap基础上实现线程安全,核心区别在于:写入操作采用同步机制(Java7用ReentrantLock分段锁,Java8优化为synchronized+CAS),读操作无锁;扩容时数据迁移并发执行,效率更高。扩容由put操作触发,通过ForwardingNode节点标识迁移状态,新线程可协助扩容。迁移时链表按hash&n拆分为高低位链表,红黑树则遍历拆分后根据长度决定是否转链表。整体采用"空间换时间"的CopyOnWrite思想,写时复制副本加锁,读时无锁访问原数组,实现读多写少场景下的高效并发。
Java
未读
【并发编程篇】HashMap底层实现原理
HashMap是Java中常用的键值对存储集合,基于哈希表实现,非线程安全,允许null键(仅一个)和null值(多个)。其底层数据结构随版本演进:JDK1.7采用数组+链表(拉链法解决哈希冲突);JDK1.8优化为数组+链表/红黑树,当链表长度≥8且数组容量≥64时,链表转为红黑树提升查询效率。默认初始容量16,扩容时容量翻倍(始终为2的幂),加载因子默认0.75(平衡空间与性能)。哈希值计算通过扰动函数减少冲突,JDK1.8简化为`(h = key.hashCode()) ^ (h >>> 16)`。核心操作如put/get通过`(n-1) & hash`定位索引,冲突时遍历链表或树。扩容(resize)涉及数据迁移,JDK1.8优化了重哈希逻辑,避免链表逆序。遍历基于迭代器,支持快速失败机制。
Java
未读
【并发编程篇】Java并发线程池底层原理详解与源码分析
本文系统介绍了线程与进程的核心概念及线程池技术。进程由程序段、数据段和PCB(进程控制块)构成,是资源分配单位;线程是CPU调度最小单位,共享进程资源,切换更高效。创建线程有四种方式:继承Thread类、实现Runnable接口、使用Callable与FutureTask获取异步结果、通过线程池管理。线程池(如FixedThreadPool、CachedThreadPool等)通过复用线程降低开销,提升性能,适用于高并发任务处理。文章还详细解析了线程状态转换(NEW、RUNNABLE、BLOCKED等)及线程池架构(Executor/ExecutorService接口体系),为多线程编程提供全面指导。
每日一问
未读
【每日一问】Java 中有那些锁?
锁可从多维度分类:按线程是否锁同步资源,分悲观锁(锁住)与乐观锁(不锁);按等锁过程,分自旋锁(不停尝试)与非自旋锁(阻塞型);按是否可中断,分可中断锁与不可中断锁;按同线程是否可重复获取,分可重入锁与不可重入锁;按多线程竞争是否排队,分公平锁与非公平锁;按能否共享,分共享锁与独占锁;synchronized中按竞争程度分偏向锁、轻量级锁、重量级锁;按实现分jvm内置锁与jdk显式锁。
Java
未读
【并发编程篇】从源码层面深入理解AQS
本文介绍了AQS(AbstractQueuedSynchronizer)作为Java并发包的核心基础框架,旨在解决CAS自旋锁导致的CPU资源浪费和总线风暴问题。AQS采用队列削峰策略,通过FIFO双向队列管理线程竞争,核心组件包括:
1. **状态标志位**:`volatile int state`标识锁状态,通过CAS保证原子性;
2. **队列节点**:`Node`类封装线程与状态(如SIGNAL、CANCELLED),支持独占/共享模式;
3. **模板方法**:定义`acquire/release`等流程,子类通过钩子方法(如`tryAcquire`)实现具体锁逻辑。
线程竞争失败时入队阻塞,锁释放时唤醒后继节点,避免空自旋。AQS为ReentrantLock、Semaphore等同步器提供统一实现基础,兼顾公平性、可重入等特性。
Java
未读
【并发编程篇】并发锁机制之深入理解synchronized
1. Java共享内存模型带来的线程安全问题1.1 引入案例两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗public class SyncDemo { private static int counter = 0; public stati
每日一问
未读
【每日一问】请说一说CPU过高的排查思路
每日一问
未读
【每日一问】说一说ZGC的GC触发机制?
每日一问
未读
【每日一问】什么情况下会发生Full GC?
什么情况下会发生Full GC?(1)System.gc()方法的调用此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可
每日一问
未读
【每日一问】如何排查内存泄漏?
如果观察一个系统,每次进行 FullGC 发现堆空间回收的比例比较小,尤其是老年代,同时对象越来越多,这个时候可 以判断是有可能发生内存泄漏.如何排查:使用jps查看虚拟机进程;使用jstat -gcutil [pid] [interval]命令查看gc回收情况;使用轻量级在线分析工具 jmap-h
每日一问
未读
【每日一问】说说JAVA形成死锁的条件以及如何排查死锁?
java 死锁产生的四个必要条件互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。循环等待,即存在一个等待队列:P1占有P2的资源,P2
Java
未读
【JVM篇】Java开疆拓土的垃圾收集器ZGC
为了满足不同的业务需求,Java 的 GC 算法也在不停迭代,对于特定的应用,选择其最适合的 GC 算法,才能更高效的帮助业务实现其业务目标。对于这些延迟敏感的应用来说,GC 停顿已经成为阻碍 Java 广泛应用的一大顽疾,需要更适合的 GC 算法以满足这些业务的
每日一问
未读
【每日一问】什么场景适合使用G1垃圾收集器?
G1垃圾收集器主要适用于大内存及对停顿时间有严格要求的场景。具体包括:堆内存建议在8GB以上,且存活对象占比超过50%;应用中对象分配与晋升的速率波动剧烈;当前垃圾回收耗时过长(超过1秒)。此外,对于需要将停顿时间控制在500ms以内的系统,G1也是理想的选择。这些特征下使用G1能获得更好的性能表现。
每日一问
未读
【每日一问】G1相对于CMS以及之前的一些垃圾收集器来说,为什么它对大内存的处理能力更强
G1相对于CMS以及之前的一些垃圾收集器来说,为什么它对大内存的处理能力更强?大内存的堆一次回收耗费时间可能很长,导致STW时间也会很长,G1提供可预测的停顿功能,这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型

