# Java
68 篇文章与「Java」相关的全部文章。
OpenFeign 的工作原理?
一、使用 @FeignClient(name = "user-service") public interface UserClient { @GetMapping("/user/{id}") User getUser(@PathVariable Long id); } 二、原理
Sentinel 的工作原理?
一、核心功能 流量控制:QPS、线程数限流,支持匀速、预热等模式。 熔断降级:慢调用比例、异常比例、异常数达到阈值时熔断。 系统保护:CPU、负载、入口 QPS、平均 RT、并发线程数。 热点参数限流:针对参数维度限流。 二、工作原理 基于滑动窗口统计实时指标。 通过责任链模式处理请求:NodeSe
Spring Cloud Gateway 的工作原理?
一、核心概念 Route:路由,由 ID、目标 URI、断言、过滤器组成。 Predicate:断言,匹配 HTTP 请求的条件(路径、方法、Header 等)。 Filter:过滤器,请求前后处理(鉴权、限流、日志、修改请求/响应)。 二、执行流程 请求进入 Gateway,由 HandlerMa
Nacos 的 CP 和 AP 模式?
一、AP 模式(临时实例) 服务实例注册后,通过心跳维持,心跳超时则剔除。 各节点数据可能短暂不一致,但保证可用性。 适合服务注册场景,实例变化频繁。 二、CP 模式(持久实例) 实例注册需要集群半数以上节点确认,强一致性。 节点不可用时不会自动剔除,需手动注销。 适合需要强一致性的场景。 三、切换
Spring Cloud 常用组件有哪些?
一、注册中心 Eureka:Netflix 出品,AP,自我保护机制。 Nacos:阿里出品,支持 CP/AP 切换,同时支持配置中心。 Consul:支持服务发现、KV 存储、健康检查。 二、配置中心 Spring Cloud Config:基于 Git。 Nacos Config:配置实时推送。
Spring 如何解决循环依赖?
一、什么是循环依赖 A 依赖 B,B 依赖 A,形成循环。 二、三级缓存 Spring 通过三级缓存解决 singleton 的循环依赖: singletonObjects:一级缓存,存完全初始化好的 Bean。 earlySingletonObjects:二级缓存,存早期引用(实例化但未属性赋值)
Spring 事务的传播行为和隔离级别?
一、七种传播行为 传播行为 说明 REQUIRED(默认) 有事务就加入,没有就新建 REQUIRES_NEW 总是新建事务,挂起当前事务 SUPPORTS 有事务就加入,没有就非事务执行 NOT_SUPPORTED 非事务执行,挂起当前事务 MANDATORY 必须有事务,否则抛异常 NEVER
Spring AOP 的实现原理?
一、AOP 概念 面向切面编程,把横切逻辑(日志、事务、权限)从业务代码中抽离,通过动态织入实现。 二、动态代理 JDK 动态代理:目标类实现接口时使用,基于反射生成代理类。 CGLIB 代理:目标类无接口时使用,基于 ASM 生成目标类的子类。 Spring 自动选择:有接口用 JDK,无接口用
Spring Bean 的作用域有哪些?
一、singleton(默认) 容器中只有一个实例,全局共享。适合无状态 Bean。 二、prototype 每次获取都创建新实例。适合有状态 Bean。 三、request(Web) 每次 HTTP 请求一个实例。 四、session(Web) 每个 HTTP Session 一个实例。 五、ap
Spring 的 IOC 和 DI 是什么?
一、IOC(控制反转) 对象的创建和依赖管理由容器负责,而不是在代码中 new。控制权从业务代码转移到 Spring 容器。 二、DI(依赖注入) IOC 的实现方式。容器把对象依赖的其他对象注入进去。 三种注入方式: - 构造器注入:通过构造方法,推荐(依赖不可变、无循环依赖风险)。 - sett
CountDownLatch 和 CyclicBarrier 的区别?
一、CountDownLatch 一个或多个线程等待其他线程完成后再继续。 用计数器实现,countDown() 减 1,await() 等待归零。 一次性,归零后不能重置。 场景:主线程等待多个子任务完成。 二、CyclicBarrier 一组线程互相等待,全部到达屏障点后一起继续。 可循环使用,
volatile 关键字的作用?
一、两大作用 可见性:被 volatile 修饰的变量,一个线程修改后其他线程立即可见。实现:写入时立即刷新主内存,读取时从主内存重新加载。 禁止指令重排:在读写操作前后插入内存屏障。 二、不保证原子性 volatile int count = 0; count++; // 不是原子操作,多线程
AQS 的原理是什么?
一、定义 AQS(AbstractQueuedSynchronizer)是 JUC 锁的基础框架,用一个 int 状态变量(state)和一个 FIFO 等待队列实现同步。 二、核心 state:同步状态,0 表示空闲,>0 表示被占用。 CLH 队列:未获取锁的线程封装成 Node 入队,自旋 +
线程池的核心参数与工作流程?
一、七大核心参数 corePoolSize:核心线程数,即使空闲也保留。 maximumPoolSize:最大线程数。 keepAliveTime:非核心线程空闲存活时间。 unit:时间单位。 workQueue:阻塞队列。 threadFactory:线程工厂。 handler:拒绝策略。 二、
synchronized 和 ReentrantLock 的区别?
一、底层实现 synchronized:JVM 级,字节码指令 monitorenter/monitorexit,依赖对象头的 Mark Word。 ReentrantLock:JDK 级,基于 AQS(AbstractQueuedSynchronizer)实现。 二、对比 维度 synchroni
常见的 OOM 有哪些?
一、Java heap space 堆内存不足,对象太多或内存泄漏。排查:dump 堆快照,用 MAT 分析大对象/泄漏点。 二、GC overhead limit exceeded GC 耗时过长(98% 时间用于 GC 且回收不到 2% 内存)。通常是堆太小或内存泄漏。 三、Java.lang.
类加载过程是怎样的?
一、五个阶段 加载:通过类的全限定名获取二进制字节流,在内存中生成 Class 对象。 验证:校验字节码的合法性(魔数、版本、语义)。 准备:为类的静态变量分配内存并赋默认值(零值),final static 在编译期已赋值。 解析:把符号引用替换为直接引用。 初始化:执行 <clinit> 方法,
CMS 和 G1 的区别?
一、CMS 基于标记-清除算法。 以最短停顿时间为目标。 流程:初始标记(STW)→ 并发标记 → 重新标记(STW)→ 并发清除。 缺点:内存碎片、并发阶段消耗 CPU、浮动垃圾、可能 Concurrent Mode Failure 退化为 Serial Old。 二、G1 把堆分成多个 Regi
常见的垃圾回收算法?
一、判断对象是否可回收 引用计数法:对象被引用计数 +1,为 0 则回收。无法解决循环引用。 可达性分析:从 GC Roots 出发,不可达的对象可回收。GC Roots 包括栈中引用、静态变量、常量、JNI 引用。 二、回收算法 标记-清除:标记存活对象,清除垃圾。缺点:内存碎片。 标记-复制:内
JVM 运行时内存结构?
一、线程私有 程序计数器:记录当前线程执行的字节码行号,唯一不会 OOM 的区域。 虚拟机栈:每个方法调用创建一个栈帧,存局部变量、操作数栈、动态链接。栈深度过深抛 StackOverflowError。 本地方法栈:为 native 方法服务。 二、线程共享 堆:对象实例和数组,GC 主要区域,可
