- 博客(35)
- 收藏
- 关注
原创 I/O多路复用
核心思想:通过一个线程同时管理多个 Socket(文件描述符),在一个线程内同时检测 多个连接的状态(如是否可读/可写),从而实现高效的并发处理。中读写数据,那么如果文件描述符是阻塞的,没有数据可读写时,进程会阻塞在读写函数那里,程序就没办法继续往下执。,而且也需要在用户态与内核态之间拷贝文件描述符集合,这种方式随着并发数上来,性能的损耗会呈指数级增长。上,直到数据准备好。,表示文件描述符集合,而且所支持的文件描述符的个数是有限制的,poll。,先从用户空间传入内核空间,由内核修改后,再传出到用户空间中。
2025-12-21 17:05:52
527
原创 深度剖析线程池的核心设计思想,以及这种设计思想在其它场景下的应用
线程池的设计思想是一种资源池化的思想,通过预先创建一定数量的线程,并管理它们的生命周期,来避免频繁创建和销毁线程的开销,提高系统性能。同时,线程池通过任务队列来缓冲待处理的任务,实现任务的异步执行和流量控制。微服务中的熔断器和限流器:在微服务架构中,为了保护系统不被过多请求压垮,可以使用线程池来限制并发请求数,当线程池满时,拒绝新的请求,从而实现限流。提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。
2025-12-08 15:59:07
414
原创 Java中的常量池和字符串常量池
常量池是类文件(.class文件)中的一部分,用于存储编译时生成的各种字面量(Literal)和符号引用(Symbolic References)。每个类都有自己的常量池,在类加载后,这部分数据会存储在方法区(Java 8之前)或元空间(Java 8及之后)中。字符串常量池是JVM中为了减少重复字符串对象而设计的一个特殊内存区域。它存储的是字符串对象的引用,这些字符串对象是在编译期或运行期通过intern()方法放入池中的。常量池。
2025-12-08 15:47:25
348
原创 new 一个对象时堆中的内存分配过程
new一个对象在堆中的内存分配过程可以概括为:检查类加载 -> 选择分配方式(指针碰撞或空闲列表) -> 解决并发问题(CAS或TLAB) -> 初始化内存 -> 设置对象头 -> 执行构造方法。这个过程是JVM自动管理的,但了解其原理有助于我们编写更高效的代码,并在出现内存问题时能够更好地分析和调优。
2025-12-08 15:31:48
685
原创 在动态代理过程中,原始类中用static关键字修饰的变量会被代理吗,为什么?
在动态代理中,代理对象是通过实现原始类的接口(对于基于接口的代理)或继承原始类(对于基于子类的代理,如CGLIB)来创建的。但是,静态变量属于类本身,而不是类的实例。因此,无论是在基于接口的动态代理还是基于子类的动态代理中,代理对象都不会改变原始类中静态变量的行为。
2025-12-08 11:27:31
256
原创 Java 中 IO 流分为几种?BIO,NIO,AIO 有什么区别?
Java IO流按不同维度分为字节流/字符流、输入流/输出流、节点流/处理流。而BIO、NIO、AIO是Java中处理I/O的三种模型,它们分别适用于不同的场景。随着高并发网络应用的发展,NIO和AIO的使用越来越广泛,尤其是在需要处理大量并发连接的服务器端编程中。
2025-12-01 09:14:57
856
原创 谈谈Error和Exception的区别
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题。
2025-11-28 21:21:34
406
原创 “equals”与“==”、“hashCode”的区别和使用场景
=:比较基本数据类型的值或引用类型的内存地址。equals():默认比较内存地址,但通常被重写用于比较对象的内容。hashCode():返回对象的哈希码,用于哈希表。重写equals()时必须重写hashCode(),以保证在哈希表中正确工作。使用==判断两个引用是否指向同一个对象。使用equals()判断两个对象在逻辑上是否相等(内容相同)。使用hashCode()主要是为了在哈希表中快速定位对象。
2025-11-28 21:10:29
434
原创 Java中深拷贝、浅拷贝和零拷贝的区别
特性浅拷贝深拷贝零拷贝核心目标快速创建对象副本创建完全独立的对象副本优化I/O性能,减少CPU拷贝操作层面对象内存级别对象内存级别操作系统/I/O级别数据共享共享引用类型成员不共享任何引用类型成员不适用性能开销较低较高(取决于对象图的复杂度)极低(减少了CPU拷贝和上下文切换)主要应用场景需要快速复制,且不介意共享子对象需要完全隔离的副本,避免副作用大文件传输、网络文件服务、消息队列等高性能场景简单来说:浅拷贝和深拷贝解决的是对象复制的问题(“复制”的深度不同)。零拷贝解决的是。
2025-11-28 20:51:19
292
原创 java中的强、软、弱、虚引用之间的区别
在Java中,引用类型分为强引用、软引用、弱引用和虚引用四种。它们的主要区别在于垃圾回收器对待它们的方式,从而使得它们在不同的场景下有不同的用途。
2025-11-28 16:29:44
308
原创 count(*) count(0) 和 count(主键字段) 和 count(字段)执行效率对比以及具体执行过程
1. 数据库引擎选择最小的可用索引2. 遍历索引的叶子节点(不访问表数据)3. 对每一行,直接返回常数04. 计数器对0进行计数(实际上就是计行数) 5. 返回总行数。不检查任何实际数据使用最轻量级的索引性能最优1. 选择主键索引(通常是聚簇索引)2. 遍历主键索引的叶子节点3. 对每一行,检查主键字段是否为NULL4. 如果主键不为NULL,计数器+15. 返回计数结果主键不可能为NULL,所以实际计数所有行但仍需进行NULL检查的逻辑性能略低于COUNT(0)
2025-11-06 21:46:56
322
原创 一条SQL语句的完整执行流程
我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。好了,现在我们对 Server 层和存储引擎层有了一个简单认识,接下来,就详细说一条 SQL 查询语句的执行流程,依次看看每一个功能模块的作用。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。开始执行前,先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误。
2025-10-28 21:52:44
780
原创 Spring中事务的传播行为
methodA()和methodB()。methodA调用了methodB。我们来分析不同传播行为下methodB的表现。1. REQUIRED(默认)语义:支持当前事务。如果当前没有事务,就新建一个事务。场景:最常用的设置,适用于大多数情况。举例如果methodA开启了事务,则methodB会加入这个事务。如果methodA没有事务,则methodB会新建一个事务。效果:两者处于同一个事务中,任何一个方法抛出异常,整个事务都会回滚。语义:支持当前事务。如果当前没有事务,就以非事务方式执行。场景。
2025-10-25 11:37:17
799
原创 Java中的异常有哪些?
可查异常:必须处理,否则编译不通过。通常代表外部错误,应用程序应该能够处理。运行时异常:由程序逻辑错误引起,可以不处理,但应该通过代码改进来避免。错误:系统级严重问题,一般无法处理,也不要求处理。在实际开发中,我们应该根据具体情况选择合适的异常处理方式。对于可查异常,通常需要捕获并处理;对于运行时异常,我们应该通过代码检查来避免,而不是依赖异常处理;对于错误,我们通常无法处理,只能尽量预防。
2025-10-24 15:42:34
371
原创 Spring 事务和分布式事务之间的区别和联系
是对底层数据库事务(主要是JDBC事务)的封装和增强,提供了声明式、编程式等易用API。调用订单服务的本地事务,在执行前,Seata的数据源代理会拦截SQL,生成快照和回滚日志(undo_log)。在一个典型的微服务分布式事务场景中,每个微服务内部在执行本地业务时,依然会使用。:订单服务、库存服务、积分服务是三个独立的进程,连接三个独立的数据库。调用库存服务,同样,库存服务在本地事务中处理扣库存,并生成undo_log。,需要保证这些不同节点上的数据操作形成一个整体,要么全部成功,要么全部失败。
2025-10-23 20:32:52
1203
原创 场景分析题-有一台机器,部署了 Java 应用以后,发现它这个 CPU 持续被打满,现在需要排查定位,应该怎么做?
宏观定位top→ 找到问题 PID线程分析top -H→ 找到问题 TID → 转换十六进制堆栈分析jstack→ 关联 TID 与代码工具深入Arthasjstat/火焰图 → 定位热点方法代码修复:根据分析结果修改问题代码。
2025-10-22 11:41:45
485
原创 26秋招三分钟快速背诵一个八股-Spring事务实现的具体实现流程及常见的失效场景
最终,容器中注入的 Bean 不再是原始的目标对象,而是一个被代理对象包装后的对象。Spring 在创建代理时,会跳过这些方法,不会为其添加事务拦截。当一个业务方法被调用时,实际执行的是代理对象的方法。是目标对象的直接调用,而不是通过代理对象调用,因此事务拦截链不会生效。它是事务操作的入口,负责事务的创建、提交和回滚。:在一个类中,一个非事务方法 A 直接调用同一个类中的事务方法 B。,它会在一个非事务的上下文中运行,挂起任何现有的事务。:AOP 无法对静态方法进行代理,因为它是属于类的,而不是实例的。
2025-10-20 22:16:07
1150
原创 场景分析题-一个订票系统,用户锁单超过一定时间后未付款需要取消锁单,如何实现?如果在你取消锁单时,用户点击了付款,并已经跳转到了第三方支付软件该怎么办?
在创建锁单订单后,立即向一个延迟队列(如 RabbitMQ 的 Delayed Message Plugin, RocketMQ 的定时消息,或 Redis 的 ZSet)发送一个消息,延迟时间为锁单超时时间(如15分钟)。前端系统此时可能还显示“支付成功”,但因为回调失败,最终需要引导用户查看订单状态为“已取消”,并提示“支付金额将在X小时内原路退回”。如果更新成功(受影响行数=1),则回调逻辑成功:确认库存、发邮件通知用户等。已经不满足,更新会失败(受影响行数=0),任务安静退出。
2025-10-19 15:36:50
491
原创 26秋招三分钟快速背诵一个八股-Spring中Bean的生命周期
元数据指的是,描述数据的数据,比如说类名,属性之类的,具体数据存储在内存中,容器启动时,首先要读取你提供的“图纸”,即配置元数据,来了解需要管理哪些 Bean 以及它们之间的依赖关系)Spring IoC容器管理Bean的全过程是一个精密的、可高度扩展的生命周期流程。它是 Spring 框架中一个非常重要的接口,它的实例对象包含了创建一个 Bean 所需要的所有元信息,例如。容器会调用相应的回调方法,将容器本身或Bean的名字等“注入”给Bean。的子接口,是更“强大”和“高级”的容器。
2025-10-18 21:09:27
1962
原创 26秋招三分钟快速背诵一个八股-Spring中的常用注解
2.@Repository:对应数据访问层(DAO层),用于将数据访问层类标识为Spring中的Bean,其功能与@Component相同,但具有额外的异常自动转换(用于将数据访问异常转换为Spring的统一异常)功能。2.@ComponentScan:用于自动扫描指定包下的组件(被@Component、@Repository、@Service、@Controller注解的类),并将其注册为Bean。另外,还有@Bean注解,它通常出现在@Configuration注解的类中,用于定义Bean。
2025-10-16 22:31:06
476
原创 26秋招三分钟快速背诵一个八股-JVM调优
7)一般情况下,年轻对象放在eden区,当第一次GC后,如果对象还存活,放到survivor区,此后,每GC一次,年龄增加1,当对象的年龄达到阈值,就被放到tenured老年区。如果想让对象留在年轻代,可以设置比较大的阈值。通过设置合理的eden区,survivor区及使用率,可以将年轻对象保存在年轻代,从而避免full GC,使用-Xmn设置年轻代的大小。1)设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。
2025-10-14 16:36:11
1008
原创 26秋招三分钟快速背诵一个八股-JVM中常见的垃圾回收器
CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。2.并发标记:这个过程与用户线程并行,从初始标记的对象出发,遍历整个对象图,标记所有的存货对象,由于这个过程是与用户线程并行执行,在执行过程中可能会存在对象状态变化的情况,即漏标错标问题。垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成,性能较低。
2025-10-12 20:59:26
550
原创 26秋招三分钟快速背诵一个八股-JVM中常见的垃圾回收算法
在进行垃圾回收时,不同的对象引用类型,GC会采用不同的回收时机换句话说,自动的垃圾回收的算法就会变得非常重要了,如果因为算法的不合理,导致内存资源一直没有释放,同样也可能会导致内存溢出的。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的直接清理可回收对象,而是将存活对象都向内存另一端移动,然后清理边界以外的垃圾,从而解决了碎片化的问题。优缺点同标记清除算法,解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。
2025-10-11 17:35:44
822
原创 26秋招三分钟快速背诵一个八股-内存溢出和内存泄漏
还有一个常见的内存泄漏场景就是我之前提到过的在ThreadLocal中被强引用的value值如果没有显示执行remove方法释放的话会随着线程池中的线程一直存在,占用的那部分内存得不到释放,感兴趣的可以看看这篇文章。如果程序加载的类过多,或者使用反射、动态代理生成大量的类,就可能导致方法区溢出。这可能是由于内存泄漏,也可能是因为堆内存设置太小,或者程序需要处理的数据量过大(大对象)。:使用NIO时,可能会申请直接内存(Direct Memory),如果直接内存不足,会抛出。)的生命周期与程序一致。
2025-10-10 21:38:28
1004
原创 26秋招三分钟快速背诵一个八股-JVM的组成部分
Java虚拟机(JVM)是Java技术的核心,它是一个抽象的计算机,负责执行Java程序。这是通过将Java源代码编译成平台无关的字节码(.class文件),然后由JVM解释执行这些字节码实现的。老年代中存放的一般为程序经常使用的对象,所以内存一般分配的要比新生代的更多,在整个堆中,老年代和新生代的内存比例大概是3:2。在JDK 8之前,它的实现被称为“永久代 (PermGen)”,JDK 8及之后被改为“元空间 (Metaspace)”,并使用本地内存(而非JVM内存)实现。:这是最大的一块内存区域,
2025-10-09 20:29:46
1089
原创 26秋招三分钟快速背诵一个八股-Java动态代理技术的实现原理
代理对象可以在调用真实对象的方法之前和之后,附加自己的操作(如日志、事务、权限检查等),从而实现“增强”或“控制”原始对象的目的,是AOP(面向切面编程)的核心实现方式。它完全依赖于反射机制。你需要实现这个接口,在。方法中编写代理的逻辑。来直接生成代理对象。
2025-10-07 21:42:05
267
原创 26秋招三分钟快速背诵一个八股-Java的反射机制中的invoke方法详解
例如,你可以从配置文件中读取一个类名和方法名,然后动态地加载这个类、创建对象、并调用其方法。它就像一张身份证,可以告诉你关于这个人的信息,但不能代替这个人本身去做事。这就是我们为什么不能直接调用method方法的原因,它只是包含了一个方法所有的描述信息,而没有实际执行的代码块。希望以上内容能为您解答疑惑,欢迎在大家评论区讨论各自的理解,如果上述内容对您有帮助的话辛苦点一点免费的小赞赞,关注我每天分享一个核心八股。方法),你必须提供一个具体的对象实例,否则 JVM 不知道操作谁的数据。
2025-10-06 21:01:15
644
原创 26秋招三分钟快速背诵一个八股-Java的反射机制详解
2.getMethod("add")/getDeclaredMethod("add"):Class对象这个接口收到请求之后,通过JNI调用底层的Native方法。Native方法通过Class对象内部的隐藏指针,跳转到元空间的Klass结构,在其方法元数据列表中查找名为"add"且参数匹配的方法。,可以动态地获取类的所有信息(如方法、字段、构造器、父类等),并可以操作这些信息和对象(如创建实例、调用方法、修改字段值)。如果对您有帮助,辛苦点个免费的赞关注支持一波,您的支持是我创作分享的动力。
2025-10-05 19:20:47
422
原创 26秋招三分钟快速背诵一个八股-Klass对象和Class对象的联系和区别
其实这个过程中会创建两个Class对象,一个是Klass对象,C++定义的真实对象模型,存放在元空间中,另外一个就是我们常用的Class对象,是暴露给Java应用程序的对类元数据的一个Java层面的镜像,这个对象存放在堆中。1.创建时机:当一个类被JVM的类加载器加载时,JVM会同时创建两个对象:在方法区(Metaspace)创建一个。值得注意的是,它对Java程序员是不可见的,它是一个纯粹的JVM实现细节,位于JVM的本地内存中,Java代码无法直接访问。2.目的:它是JVM运行时真正的“蓝图”。
2025-10-04 11:16:03
1136
原创 26秋招三分钟快速背诵一个八股-类加载过程
其实这个过程中会创建两个Class对象,一个是Klass对象,C++定义的真实对象模型,存放在元空间中,另外一个就是我们常用的Class对象,是暴露给Java应用程序的对类元数据的一个Java层面的镜像。在程序编译完成之后,会生成对应的字节码文件,但是如果程序想要真正运行则需要将字节码文件通过JVM翻译成底层的机器码,程序在运行过程中可能会创建对象,调用静态方法等,因此在这之前JVM需要将类的信息加载到内存中。:将常量池中的符号引用(如类和方法的名称)转换为直接引用(实际内存地址)这是类加载的最后一步。
2025-10-03 10:41:41
412
原创 26秋招三分钟快速背诵一个八股-ThreadLocal
就像公司里每个人(线程)都有一个自己的储物柜(ThreadLocal),柜子里可以放自己的东西(变量)。一个线程可以有多个ThreadLocal变量(多个钥匙开同一个储物柜的不同格子),因为它们都以不同的ThreadLocal实例作为key存储在同一个Map里。尤其是在线程池环境下,这是强制要求的最佳实践。如果线程本身迟迟不结束(例如使用线程池中的线程,它们是复用的,几乎不会结束),这个Value就会一直存在,造成。)时,由于Key是弱引用,下次GC时这个Key就会被回收,导致整个Entry的Key为。
2025-10-02 21:16:05
968
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅