自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 过滤器和拦截器的区别与使用

过滤器和拦截器的区别主要体现在以下 5 点:过滤器来自于 Servlet,而拦截器来自于 Spring 框架,从上面代码中我们也可以看出,过滤器在实现时导入的是 Servlet 相关的包,如下图所示:而拦截器在实现时,导入的是 Spring 相关的包,如下图所示:请求的执行顺序是:请求进入容器 > 进入过滤器 > 进入 Servlet > 进入拦截器 > 执行控制器(Controller),如下图所示:所以过滤器和拦截器的执行时机也是不同的,过滤器会先执行,然后才会执行拦截器,最后才会进入真正的要调用的方法

2025-10-10 10:19:45 1054

原创 Spring Cloud Gateway面试题笔记

(1)Spring Cloud Gateway 属于 Spring Cloud 生态中的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。路由转发:Spring Cloud Gateway 可以根据配置的路由规则将请求转发到相应的后端服务。它支持根据请求的 URI、请求头、请求参数等信息进行路由匹配和转发,实现动态的服务路由。

2025-09-28 12:45:19 865

原创 elasticsearch面试八股文

Elasticsearch是一个基于Lucene的全文搜索引擎,也可称分布式搜索引擎,用于Java开发的,且开源,具有Http Web和无框架Json文档的分布式。2、ElasticSearch中的集群、节点、索引、文档、类型是什么?集群:是一个或多个服务器的集合,共同保存数据并提供所有节点的联合索引和搜索功能。集群有唯一标志,为"ElasticSearch"。节点:节点是属于集群一部分的单体服务器,储存有数据并参与集群索引和搜索功能。如果节点设置为按名称加入集群,则该节点只能是集群的一部分。索引。

2025-09-27 18:01:33 932

原创 Redisson原理

RLock是Redisson分布式锁的最核心接口,继承了concurrent包的Lock接口和自己的RLockAsync接口,RLockAsync的返回值都是RFuture,是Redisson执行异步实现的核心逻辑,也是Netty发挥的主要阵地。在一个分布式环境下,假如一个线程获得锁后,突然服务器宕机了,那么这个时候在一定时间后这个锁会自动释放,你也可以设置锁的有效时间(不设置默认30秒),这样的目的主要是防止死锁的发生。管道不是原子的,不过redis的批量操作命令(类似mset)是原子的。

2025-09-18 12:25:19 1049

原创 AOP解决了那些问题

一旦配置好,Spring AOP 自动在你所有的方法前插入这段逻辑,不用你每个方法手动写。(面向切面编程,Aspect-Oriented Programming)主要是为了解决。事务控制(其实 Spring 的事务本质就是基于 AOP 实现的)每个方法都要写日志和权限检查,

2025-07-25 13:43:36 423

原创 JVM垃圾回收之三色标记法

主流的垃圾收集器基本上都是基于可达性分析算法来判定对象是否存活的。根据对象是否被垃圾收集器扫描过而用白、灰、黑三种颜色来标记对象的状态的一种方法。而其中白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始阶段,所有的对象都是白色的,若在分析结束之后对象仍然为白色,则表示这些对象为不可达对象,对这些对象进行回收。灰色:表示对象已经被垃圾收集器访问过,但是这个对象至少存在一个引用(属性)还没有被扫描过。黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经被扫描过。

2025-07-25 10:40:55 787

原创 Mybatis中#{} 和 ${} 的区别

{} 是预编译处理,${} 是直接替换;${} 存在SQL注入的问题,而 #{} 不存在;

2025-07-25 10:14:50 1071

原创 JVM内存屏障

若无内存屏障,步骤(3)和(4)可能被重排序,导致线程B访问到未初始化的对象。• 减少屏障使用:避免过度使用volatile,优先用final或不可变对象。(可能冲刷写缓冲+刷新缓存),但能同时解决可见性和重排序问题。• 无锁数据结构:如AtomicLong利用CAS替代锁。• 缓存行对齐:通过@Contended注解避免伪共享。若未正确同步,其他线程可能看到尚未初始化的。:弱内存模型,需要显式插入所有屏障(如。屏障,确保对象初始化完成后再写入引用。:天然支持较强的内存模型(仅需。屏障,强制刷新缓存。

2025-07-25 09:18:59 464

原创 Java接口测试

此外,现在也有许多云端测试平台,如 Apifox ,可以帮助用户管理测试用例、自动化测试、模拟数据等,它为用户提供了一个直观、易于使用的界面,可以帮助测试人员更好地管理和组织测试用例,并快速执行和分析测试结果。尤其是在微服务架构中,不同的服务可能会频繁地进行版本迭代和更新,相对界面测试,API 测试可更早开始,让系统更快地响应业务需求。:需要准备各种测试数据,覆盖不同的情况,包括正常情况、异常情况、边界情况等,如接口返回值验证:验证接口返回值的正确性、完整性、合法性等,包括返回值类型、长度、格式、范围等。

2025-07-24 11:43:47 657

原创 Java软件开发流程

作为软件开发工程师,我们有必要掌握软件开发的整个流程,明确在这一过程中各个岗位的角色及其相应的职责和分工,并且熟悉软件开发中常见的三种软件环境。在本节内容中,我们将综合讨论软件开发流程、角色分工和软件环境这三个关键方面,以便对软件开发有一个全面的了解。

2025-07-24 11:13:01 950

原创 Java对象的定位与分配

什么是对象的定位呢?比如:T t = new T();定位的意思就是说如何通过引用变量t 去 找到T的实例。咋找呢?通俗点就是:t 的指针不就是指向T对象实例,cpu通过指针里面存放的地址,找到T对象实例的首地址,然后通过对象的大小在内存里面截取呗,比如对象大小是24个字节,那么就从首地址开始截取24个字节呗。没错,是这么干的。但是jvm的执行过程,其实是有两种方式的。java对象的定位主要会分为两种方式:直接和间接。

2025-07-22 14:46:21 162

原创 Java创建对象时的内存分配

逃逸分析在 Java 程序运行过程中,对象需要在堆内存中分配空间。当多个线程并发地创建对象时,如果没有特殊机制,就需要通过加锁等方式来保证内存分配操作的原子性,避免多个线程同时操作同一块内存区域导致数据不一致等问题,然而这样会带来较大的性能开销。

2025-07-22 13:15:38 696

原创 Java中的逃逸分析

在Java的编译体系中,一个Java的源代码文件变成可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件。第二段编译是把.class转换成机器指令的过程。第一段编译就是​​​​命令。在第二编译阶段,JVM 通过解释字节码将其翻译成对应的,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。这就是传统的JVM的解释器(Interpreter)的功能。为了解决这种效率问题,引入了技术。

2025-07-22 10:50:13 928

原创 JVM常用的配置参数

启用 Serial 垃圾收集器,单线程工作,适用于小型应用、单核处理器或对资源占用敏感场景,GC 时会 Stop-The-World (暂停用户线程 )。

2025-07-22 08:51:54 1444

原创 JVM压缩指针

在32位JVM中,常用的压缩指针算法是使用32位指针的高30位来存储对象的偏移量,而低2位用于标识指针是否被压缩。在64位JVM中,常用的压缩指针算法是使用64位指针的高32位来存储对象的偏移量,而低32位用于标识指针是否被压缩。在32位JVM中,每个指针只需要占用3字节的内存空间,而在64位JVM中,每个指针只需要占用4字节的内存空间。JVM利用对象对齐的特性,可以根据对象的偏移量来计算对象的地址,而不需要使用完整的指针。因此,JVM可以使用对象的偏移量来计算对象的地址,而不必使用完整的指针。

2025-07-22 07:28:33 698

原创 GCRoot包括哪些内容

在Java虚拟机(JVM)中,垃圾回收(GC)是自动管理内存的重要机制,用于回收不再使用的对象所占用的内存空间。:如java.lang.reflect.Method或java.lang.reflect.Field等类的实例可能通过反射维持对对象的引用。:Class文件的常量池在类加载后会进入方法区的运行时常量池,其中的字符串字面量和类符号引用等也可能引用到对象实例。:类的静态字段所引用的对象,因为静态字段属于类级别,生命周期通常与JVM相同,因此它们引用的对象也是GC Root。

2025-07-21 09:55:00 454

原创 G1垃圾回收器

G1由JDK7引入,Java8基本成熟,JDK9称为默认垃圾回收器,JDK14删除CMS,G1登基。前提新生代满了并且老年代占用达到阈值会触发混合回收,先执行新生代回收和再执行老年代回收。也有说新生代占堆比例是动态变化的最小5%,然后慢慢增加到60%此命令可以设置region区大小为4M,分区最大可以设置32M。新生代大约占整个堆的1/3,老年代占比大约剩余的2/3。当混合回收后对象仍无法分配会触发Full GC。新生代满了就会触发新生代回收,只回收新生代。

2025-07-21 09:53:35 448 1

原创 JDK8默认垃圾回收器

Parallel Scavenge 主要负责新生代的垃圾回收,Parallel Old 主要负责老年代的垃圾回收。这种组合可以提高垃圾回收的效率和吞吐量,适合需要高吞吐量的应用程序。不过,如果应用程序对响应时间有较高的要求,需要考虑使用其他类型的垃圾回收器。和 Parallel Old 组合。这两个回收器都是基于并行的垃圾回收器,适用于。是Parallel scavenge。

2025-07-20 19:07:22 297

原创 G1回收器垃圾回收过程

垃圾占内存分段比例越高的,越会被先回收。此阶段,对象树被遍历,Eden 区内存段中存活的对象会被复制到 Survivor 区中空的内存分段,Survivor 区内存段中存活的对象如果年龄未达阈值,年龄会加 1,达到阀值会被会被复制到 Old 区中空的内存分段。YGC 时,首先 G1 停止应用程序的执行(Stop-The-World),G1 创建回收集(Collection Set),回收集是指需要被回收的内存分段的集合,年轻代回收过程的回收集包含年轻代 Eden 区和 Survivor 区所有的内存分段。

2025-07-20 15:43:27 1000

原创 IO多路复用解析

I/O模型是指网络I/O模型是服务端如何管理连接,如何请求连接的措施,是用一个进程管理一个连接(PPC),还是一个线程管理一个连接(TPC),亦或者一个进程管理多个连接(Reactor)IO多路复用中多路就是多个TCP连接(或多个Channel),复用就是指复用一个或少量线程是多个网路IO复用一个或少量线程来处理这些连接。

2025-07-20 10:18:11 950

原创 为什么Redis能比MySQL性能更好?

内存的访问延迟通常在 10-100 纳秒级别,而 MySQL 的数据默认存储在磁盘(或 SSD)中,机械硬盘(HDD)的访问延迟约为 5-15 毫秒,即使是固态硬盘(SSD)也需要 10-100 微秒,比内存慢 3-6 个数量级。服务器接收到请求后,无需进行复杂的语法解析和查询优化,直接根据命令类型调用对应的数据结构操作函数,处理流程几乎是 "解析 - 执行 - 响应" 的线性流程,延迟极低。此外,Redis 的事务在单线程中顺序执行,无需处理并发事务的隔离问题,进一步提升了执行速度。

2025-07-20 08:53:17 812

原创 TCP三次握手四次挥手

TCP使用三次握手和四次挥手来建立和终止连接。TCP设置三次握手和四次挥手是为了确保可靠的连接建立和终止,在网络通信中保护数据的完整性和可靠性。

2025-07-20 08:21:53 951

原创 HTTP笔记

数据包从A主机发送到B主机,两台主机之间有很多网络设备,每个网络设备都可能发生数据丢失,数据丢失就要进行数据重传(可能没有丢失,由于网络延迟原因),这就会造成数据重复,通过网络设备时,数据可能被串改或由于设备的错误,造成数据错误,所以还要进行数据完整性的校验,传输介质也可能是多样的,如内网可能使用网线传输,通过公网可能需要光纤传输,这就需要不同介质之间的信号转换,像路由器从光纤到无线脉冲的转换,距离远还有信号衰减问题。

2025-06-18 19:01:23 360

原创 spring源码1之debug流程

看似结束了,但StandardEnvironment继承了父类,并创建了父类对象AbstractEnvironment,执行了下面的构造方法。最终会调用StandardEnvironment里面的customizePropertySources方法。调用父类构造方法,准备集合对象等初始化操作,setConfigLocations()设置配置文件的路径。进入ClassPathXmlApplicationContext的构造方法里面。进入refresh方法有几个重要的方法。

2025-06-10 21:44:47 141

原创 spring源码0之概述

容器先要有xml、proterties、yml配置文件,其中定义bean的配置信息,从配置信息变成beanDefinition中间有一个解析处理环节,这个解析处理环节定义了规范,方便扩展,即BeanDefinitionReader。当spring容器创建的bean对象在进行具体操作的时候,如果需要容器的其他对象,此时可以将对象实现Aware接口,来满足当前需要。而使用FactoryBean只需要调用getObject就可以返回具体的对象,整个对象的创建过程是由用户自己来控制的,更加灵活。

2025-06-09 17:19:23 399

原创 JVM面试笔记

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址当线程一执行到第十行后,时间片被其他线程夺走了,就记录以下第十行的位置,这时线程二开始执行,执行到了第九行后结束,时间片又被线程一夺走了,线程一从线程计数器中得知线程执行到第十行,从第十行继续执行详细介绍一下Java堆线程共享区域:主要用来保存对象实例,数组等,当队中没有内存空间可以分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

2025-05-13 23:33:55 631

原创 springboot2.6.13源码学习笔记之ansi

先来看看AnsiElement接口超级简单,Spring Framework 中用于处理 ANSI 转义序列的接口,主要用于在终端(如控制台)中输出带颜色或样式的文本。ANSI 转义序列是一种特殊的字符序列,用于控制终端的文本显示格式(如颜色、加粗、下划线等)。先来看看Ansi8BitColor类。

2025-05-11 17:10:28 777

原创 springboot2.6.13源码自学笔记之SpringApplicationAdminMXBean

SpringApplicationAdminMXBean接口是一个关键的 JMX(Java Management Extensions)管理接口,用于监控和管理 Spring Boot 应用程序。SpringApplicationAdminMXBean的子实现类关系图。

2025-05-11 13:00:51 756

原创 多线程相关面试题笔记

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行一个进程之内可以分一到多个线程。

2025-05-08 18:29:12 316

原创 集合面试八股文笔记

Java集合框架体系。

2025-05-07 19:59:02 1003

原创 微服务篇八股文笔记

服务提供者的每一个微服务都要定期像注册中心发送心跳,即心跳续约,每30秒一次,证明服务实例健康,若某一个实例一直没有发送心跳,90秒后注册中心就会认为这个实例挂了,注册中心就会在服务列表中把挂掉服务的地址去掉,服务消费者在拉取服务时就拉不到挂掉的服务。服务提供者启动服务将自己的信息注册到注册中心中,注册中心保存了服务提供者的地址,服务消费者拉取提供者的信息,放到本地,若有多个提供者,进行负载均衡,然后远程调用。nacos默认是临时实例,与eureka一样。

2025-05-04 19:28:56 640

原创 Java框架面试八股文笔记

AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。记录操作日志缓存处理spring中内置的事务处理记录操作日志思路。

2025-05-03 17:28:33 657

原创 MySQL面试八股文笔记

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。MySQL底层索引采用的是B+树,若是二叉树最坏的情况会退化为链表,若使用红黑树,在数据量庞大的情况下,树的高度会很高,查找效率不高。

2025-04-25 15:48:08 380 1

原创 Redis面试八股文笔记

redis面试

2025-04-19 22:09:08 1311

原创 leetcode算法

中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组有多个中心下标,应该返回最靠近左边的那一个。一个有序数组nums原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度,不能使用额外的数组空间,必须在原地修改输入数组并在使用 O(1)额外空间的条件下完成。给定一个整数数组 nums,请编写一个能够返回数组“中心下标”的方法。在不使用sqrt(x)函数的情况下,得到x的平方根的整数部分。例:输入:[0,1,2,2,3,3,4]注意:中心下标可能出现在数组的两端。

2025-04-14 14:25:00 226

原创 排序算法Java

【代码】排序算法Java。

2025-04-09 13:36:56 118

转载 八种JVM垃圾回收器

有了这个 CSet 信息,G1 在进行垃圾收集时可以根据用户设定的可接受停顿时间来进行分析,找出在设定的时间范围内收集哪些区域最划算,然后优先收集这些区域。这样做不仅可以优先收集垃圾最多的 Region,还可以根据用户的设定来计算收集哪些 Region 可以达到用户所期望的垃圾收集时间。ZGC 的出现为 Java 应用提供了一种更加高效、可预测的垃圾回收解决方案,与传统的垃圾回收器相比,ZGC 的主要目标是实现极低的垃圾回收停顿时间,使得 Java 应用能够以更可预测的方式运行,尤其在大内存堆上表现良好。

2025-03-28 19:22:36 67

原创 自动垃圾回收学习笔记

在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。Java中为了简化对象的释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。

2024-07-13 20:35:43 1117

原创 黑客守则-网络黑客领域约定俗成的行为规则

1、不恶意破坏任何的系统,这样做只会给你带来麻烦。恶意破坏它人的软件将导致法律责任,如果你只是使用电脑,那仅为非法使用。2、不修改任何系统文件,如果你是为了要进入系统而修改它,请在达到目的后将它还原。3、不要轻易的将你要Hack的站点告诉你不信任的朋友。4、不要在bbs/论坛上谈论关于你Hack的任何事情。8、不在电话中谈论关于你Hack的任何事情。7、不要入侵或攻击电信/政府机关的主机。12、不将你已破解的账号分享与你的朋友。6、入侵期间,不要随意离开你的电脑。9、将你的笔记本放在安全的地方。

2024-07-12 12:55:11 398

原创 运行时数据区学习笔记

Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。把整个运行时数据区划分为两大类,一类是线程不共享,另一类时线程共享。线程不共享:每当创建一个线程之后,每一个线程里面都会有程序计数器、Java虚拟机栈、本地方法栈对应的数据。(我的数据由我自己来维护,别的线程无法访问我当前这个线程的数据的。数据无法共享,但安全性相对高。当线程结束之后,线程回收掉,这块内存区域也就释放。

2024-07-12 11:44:58 405

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除