每日一问
未读
【每日一问】Nacos服务注册原理
Nacos服务注册与发现核心流程:客户端启动时封装Instance对象注册,通过心跳定时任务维持连接。服务端接收到注册请求后,将Instance封装为Service并存储(Map(namespace,Map(group::serviceName,Service))),启动健康检查定时任务(超时15s设不健康,30s删除)。实例添加分两种模式:持久化数据用Raft协议(CP模式,半数节点写入成功返回);非持久化用Distro协议(AP模式,异步同步集群数据)。注册表更新采用写时复制避免并发冲突,变更后通过UDP推送通知客户端,未收到ACK则重发,客户端定时拉取服务列表兜底。服务发现依赖客户端定时拉取与服务端推送结合,确保数据实时性与可靠性。
【每日一问】Java线程的生命周期包括哪几种状态?
Java线程的生命周期包含六种状态:初始(NEW)表示线程已创建但未调用start();运行(RUNNABLE)涵盖操作系统的就绪和运行两种状态;阻塞(BLOCKED)是线程在资源争夺中被动挂起,等待资源释放,此时释放CPU但不释放内存;等待(WAITING)需要其他线程的特定动作(如通知或中断)才能唤醒;超时等待(TIMED_WAITING)与等待类似,但可在指定时间后自行返回;终止(TERMINATED)表示线程已执行完毕。这些状态共同管理线程的执行流程,确保资源高效利用和程序稳定性。(约120字)
【每日一问】 mysql为什么推荐使用自增整型的主键而不是UUID?
本文探讨了数据库主键选择的关键因素。使用整型作为主键具有显著优势:占用空间更少,节省存储资源;在查找过程中,值比较效率更高,提升查询性能。此外,自增主键与索引的有序特性相吻合,新增主键时一般不会导致叶子节点频繁分裂或平衡操作,从而优化了插入效率并减少维护开销。总体而言,整型自增主键能有效提升数据库的整体性能和稳定性。(约110字)
【每日一问】请说说synchronized和ReentrantLock的区别?
synchronized与ReentrantLock是Java中两种锁实现,主要差异如下:实现层次上,synchronized属JVM层,ReentrantLock属JDK层;锁状态判断,synchronized无法直接判断,ReentrantLock可通过isLocked判断;公平性,synchronized是非公平锁,ReentrantLock支持公平/非公平模式;中断性,synchronized不可中断,ReentrantLock的lockInterruptibly支持中断;锁释放,synchronized异常自动释放,ReentrantLock需finally手动释放,且获取方式更灵活(如tryLock、定时等待);唤醒策略,synchronized可能让后续线程先获锁,ReentrantLock遵循先来先得。
每日一问
未读
【每日一问】Java 中有那些锁?
锁可从多维度分类:按线程是否锁同步资源,分悲观锁(锁住)与乐观锁(不锁);按等锁过程,分自旋锁(不停尝试)与非自旋锁(阻塞型);按是否可中断,分可中断锁与不可中断锁;按同线程是否可重复获取,分可重入锁与不可重入锁;按多线程竞争是否排队,分公平锁与非公平锁;按能否共享,分共享锁与独占锁;synchronized中按竞争程度分偏向锁、轻量级锁、重量级锁;按实现分jvm内置锁与jdk显式锁。
每日一问
未读
【每日一问】请说一说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
每日一问
未读
【每日一问】什么场景适合使用G1垃圾收集器?
G1垃圾收集器主要适用于大内存及对停顿时间有严格要求的场景。具体包括:堆内存建议在8GB以上,且存活对象占比超过50%;应用中对象分配与晋升的速率波动剧烈;当前垃圾回收耗时过长(超过1秒)。此外,对于需要将停顿时间控制在500ms以内的系统,G1也是理想的选择。这些特征下使用G1能获得更好的性能表现。
每日一问
未读
【每日一问】G1相对于CMS以及之前的一些垃圾收集器来说,为什么它对大内存的处理能力更强
G1相对于CMS以及之前的一些垃圾收集器来说,为什么它对大内存的处理能力更强?大内存的堆一次回收耗费时间可能很长,导致STW时间也会很长,G1提供可预测的停顿功能,这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型
每日一问
未读
【每日一问】请问浮动垃圾是如何产生的
浮动垃圾主要在并发标记过程中产生,由以下两种情况导致:一是方法运行结束后,GC Root被销毁,但其引用的对象之前已被扫描标记为非垃圾对象,导致本轮GC无法回收;二是基于“原始快照”机制,灰色对象删除白色对象引用时会被记录,并在后续扫描中将白色对象标记为黑色。这两种情况均使得本该回收的内存被遗漏,留待下一轮GC处理。
每日一问
未读
【每日一问】方法区垃圾回收,如何判断一个类是无用的类?
在方法区垃圾回收中,判断一个类是否为无用类需同时满足三个条件:首先,该类的所有实例均已被回收,即Java堆中不存在该类的任何实例;其次,加载该类的ClassLoader已被回收;最后,该类对应的java.lang.Class对象未被任何地方引用,且无法通过反射访问其方法。这些条件必须全部成立,类才能被视为无用,从而可能被安全卸载以释放内存资源。
每日一问
未读
【每日一问】JVM有哪些垃圾回收算法?
JVM垃圾回收算法包括四种:标记-清除算法通过标记无用对象后清除回收,但效率不高且易产生内存碎片;标记-复制算法将内存分为两区,复制存活对象后清理,内存使用率仅半;标记-整理算法标记后移动存活对象并清理边界外内存,避免碎片;分代算法根据对象存活周期分新生代和老年代,新生代采用复制算法,老年代采用标记整理算法,优化回收效率。这些算法各有优缺点,分代算法是常用组合。

