- 博客(67)
- 收藏
- 关注
原创 spring过滤器和拦截器的区别
不同请求的执行顺序是:请求进入容器 > 进入过滤器 > 进入 Servlet > 进入拦截器 > 执行控制器。拦截器后执行,会在controller请求之前和处理完毕之后进行处理。过滤器先执行,会在servlet请求之前和相应之后进行处理。过滤器来自servlet,拦截器来自spring框架。拦截器通常实现和业务相关的工作。如身份认证和授权等。过滤器实现一些必要的基础工作,如url重定向等。
2024-08-09 21:32:37
319
原创 Spring IOC
Spring IOC解决的对象管理和对象依赖问题,本来手动new的对象交给Spring IOC容器来管理(IOC容器可以理解为一个对象工厂,工厂的管理这些对象的创建和依赖关系,当需要对象的时候从工厂获取即可)依赖注入:可以理解为控制反转的实现方式,对象无需自行创建依赖关系,依赖关系被自动注入到对象中去。控制反转:把原先自己掌控的事情交给别人来处理,可以理解为一种设计思想。集中统一管理对象,降低耦合度。
2024-08-08 19:55:48
412
原创 AOP面向切面编程
JDK动态代理只能代理实现接口的类,CGLIB可以代理没有实现接口的类。只要系统的业务逻辑需要引用通用模块,就可以使用AOP。动态代理:JDK动态代理和CGLIB动态代理。面向切面编程,实现横切逻辑的控制。
2024-08-08 17:16:22
147
原创 前缀和代码
给你一个整数数组nums,获得前缀和数组s,就可以通过前缀和数组s获取某个。如果要获取nums数组位置[left,right]上的连续子数组和。
2024-08-07 17:05:46
187
原创 单例模式详解
在真正执行时,虚拟机为了效率可能会发生指令重排比如①③②,如果线程1执行完①③还没有执行②,此时线程2获取对象会获取到没有初始化的对象,会造成线程不安全的情况。上面这种模式会出现线程安全的问题:一般会在getInstance()加上synchronized确保线程安全,但是每次获取对象都要先获取锁,并发性能差。对于某些庞大的类,频繁的创建销毁对象会耗费大量资源,并且这些对象是可以复用的。但是上述代码存在线程安全问题,为了保证线程安全,进入代码块后再次进行判空操作,即。上面的代码仍然会发生指令重排的问题。
2024-08-06 18:14:12
522
原创 java创建线程的方式
Callable用于产生结果,Future用于获取结果。2实现Runnable接口创建线程。1继承Thread类创建线程。
2024-08-06 12:10:14
100
原创 强软弱虚四大引用
在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它,如果一个对象具有强引用,垃圾回收器不会回收该对象,用来跟踪对象的垃圾回收。一般用于管理堆外内存。:内存敏感的高速缓存。
2024-08-02 19:27:53
459
原创 有了Cookie和Session 为什么还要JWT ?
服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效。不支持横向扩展,即不支持分布式模型。如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。不需要服务器端存储状态,安全的传递非敏感信息。
2024-08-01 15:39:30
203
原创 springmvc的理解
3DispatcherServlet调用HandlerAdapter执行Handler,得到ModelAndView对象。把复杂的web应用拆分为逻辑清晰的几部分,简化了开发工作。4DispatcherServlet调用视图解析器解析ModelAndView,得到View视图。5渲染View视图后,DispatcherServlet把渲染好的View视图返回给用户浏览器。2DispatcherServlet调用HandlerMapping查找Handler。
2024-08-01 00:25:57
212
原创 如何排查慢sql
2.1对表进行切分:水平切分(大表根据业务主键切分为多张小表)和垂直切分(根据业务逻辑把联系紧密的列划分在一张表上)1打开sql的慢查询日志,找到耗时最长的sql语句。使用explain查看sql查询的执行计划,进行sql优化。3网络原因或负载过高:读写分离(主库处理写操作,多个从库处理读操作)4热点数据导致负载不均衡:增加缓存,把热点数据放到缓存中。1没有索引 或 没有命中索引导致索引失效。2单表数据量过多,导致查询瓶颈。4热点数据导致单点负载不均衡。2单表数据过大:分库分表。2.2分表之后进行分库。
2024-07-31 15:52:42
182
原创 java线程状态
线程没有获取到除synchronized锁外的其他锁(如ReentrantLock)会进入Waiting状态,本质上是执行了LockSupport.park()方法。线程进入synchronized代码块时未能获取相应的monitor锁进入Blocked状态。线程run()方法执行完或者线程出现了一个没有捕获的异常终止了run()方法。new Thread()新建一个线程但还没有运行start()时。线程调用start()方法后进入Runnable状态。
2024-07-31 13:49:06
234
原创 如何定位线上OOM
1系统已经挂掉了:提前设置如下参数,获取dump文件,再使用jvisualVM定位。jmap -heap 进程名:查看特定java进程的堆内存信息。快要OOM或者频繁FULL GC时,使用如下命令到处dump文件。2内存资源使用完未释放。如:太多线程建立数据库连接而未释放。1一次性申请太多对象。如:从数据库获取大量数据。解决方法:更改申请对象的数量。3本身资源不够,无法支持日常的使用。解决方法:使用线程池。
2024-07-26 00:03:03
274
原创 垃圾回收器之 G1 CMS ZGC
将堆内存分为多个大小相等的区域(Region),每个区域都可以是 Eden 区、Survivor 区或者 Old 区。筛选回收:对各个Region的回收价值和成本进行排序,根据所期望的停顿时间制定回收计划。1可预测停顿:使用者可以定义STW的时间不能超过N毫秒。1支持TB级别的内存,可以达到10ms以内的停顿时间。(标记GC Roots直接关联到的对象,STW),(标记整个引用链,无STW会产生漏标和多标),初始标记,并发标记,最终标记同CMS;(STW,解决漏标和多标),JDK11引入的垃圾收集器。
2024-07-23 16:50:25
216
原创 sql优化
1不走select *:会增加解析器解析的成本。查询不需要的字段也会造成资源的浪费。不走索引覆盖也会产生回表。4批量操作:循环逐条操作需要多次请求数据库。批量操作只需要请求一次数据库。(建议500以内一次批量)3提升group by的效率:如果使用group by的列没有使用索引,那么查询就会变慢。6join的表不宜过多:维度难度加大(如果需要分库,那到时候sql也需要改)5使用limit:一次查询的数据过多,使用limit进行分页。2小表驱动大表:可以更好的使用索引和条件对数据进行筛选。
2024-07-22 23:35:33
199
原创 双亲委派机制
1传入类的限定名,首先判断应用类加载器是否加载过,有则返回;7否,返回ClassNotFoundException。4否,向下委派,启动类是否可以加载,是就加载;2否,判断扩展类加载器是否加载过,有则返回;3否,判断启动类加载器是否加载过,有则返回;5否,扩展类是否可以加载,是就加载;6否,应用类是否可以加载,是就加载;双亲委派机制是一种类加载机制。
2024-07-21 21:58:55
72
原创 redis为什么快
3io多路复用:目的是允许单线程同时监控多个文件描述符(网络连接)4高效的数据结构:支持在高效的时间复杂度下进行插入删除查找操作。2redis的读写模块是单线程的,避免的多线程竞争和锁开销。1redis是基于内存的。
2024-07-20 00:29:41
73
原创 synchronized锁升级过程
获取锁,但没有线程对象上并发获取锁,偏向锁升级为轻量级锁,线程采用CAS自旋方式获取锁,避免阻塞线程造成cpu在用户态和核心态来回切换造成的开销。jdk1.6之前使用synchronized使用重量级锁。jdk1.6之后为了保证线程安全的基础上提高效率,采用偏向锁->轻量级锁->重量级锁。:会在锁对象的对象头上记录当前获取该锁的线程id,该线程下次获取该锁就可以直接获取。的获取锁,轻量级锁升级为重量级锁,避免无用的自旋消耗cpu。:当2个及以上的线程。
2024-07-08 12:15:13
156
原创 Redis 如何解决集群情况下分布式锁的可靠性?
如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。节点的分布式锁,基本思路为:让客户端和多个独立的 Redis 节点依次请求申请加锁,如果客户端能够和。成功地完成加锁操作,就认为,客户端成功地获得分布式锁,否则加锁失败。:加锁成功要同时满足两个条件:如果有。的获取到了锁,并且总耗时。
2024-06-27 14:31:37
244
1
原创 ThreadLocal的原理
ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,而 value 是强引用。,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。2ThreadLocal底层是通过ThreadLocalMap实现的,每个Thread对象中存在一个ThreadLocalMap,Map的。当一个共享变量是共享的,但是需要每个线程互不影响,相互隔离,就可以使用ThreadLocal。
2024-06-22 20:34:53
493
原创 自动装箱和自动拆箱
在 Java 5 中,在 Integer 的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了。Integer i = 10 等价于 Integer i = Integer.valueOf(10)int n = i 等价于 int n = i.intValue();装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型;
2024-06-22 13:52:58
215
原创 equals和==的区别?
equals()方法:一般是比较2个对象的属性,如果属性相等返回true。equals()方法:等价于==比较2个对象。对于基本数据类型和引用数据类型作用效果不同。对于基本数据类型,比较的是。对于引用数据类型,比较的是。
2024-06-22 13:41:33
124
原创 类加载过程
参考:B站《【JVM】Java类加载机制这块算是玩明白了》java类的生命周期加载:读取class文件,转化为某种静态数据结构存储在方法区中,并在堆中生成一个便于用户调用java.lang.Class类型的对象的过程验证:对静态结构进行语法语义上的分析,确保不会产生危害虚拟机的行为准备:为类变量分配内存和并初始化类变量值解析:把符号引用替换为直接引用。符号引用是一组用来描述引用对象的一组符号直接引用:内存中的地址。A调用的B是一个具体的类那么就是静态解析;如果B是一个抽象类或接口,
2024-05-26 18:56:12
273
原创 事务的隔离性
脏读:读到另一个未提交事务的数据。不可重复读:前后二次读到的数据不一致,后一次读到已提交事务的数据。幻读:前后二次读到的记录数不一致,后一次读到已提交事务的修改结果。SQL标准提出四种隔离级别来处理上述情况,隔离级别越高,性能就越低。读未提交:一个事务未提交时,它的变更可以被其他事务看到。读提交:一个事务提交之后,它的变更才能被其他事务看到。可重复读:一个事务内,前后二次的查询的数据是一致的。MySQL InnoDB引擎默认隔离级别。串行化:给记录加锁。
2024-04-10 17:44:41
361
原创 二分查找详解
使用二分查找思路:所给nums数组升序排列,找到正数的的位置可以转换为找到≥1的位置;找到负数的位置可以理解为<0的位置。一次遍历数组的方法的时间复杂度为O(n),而二分查找的时间复杂度为O(logn)。以力扣2529为例,题目要求找到正整数的个数和负整数的个数。>x可以转换为≥ (x+1)≤ x可以转换为(>x)-1。这里给出通用的二分查找:在。<x可以转换为(≥x)-1。
2024-04-09 16:14:01
236
原创 什么是缓存雪崩、击穿、穿透?
第二种用户体验较好,业务线程发现缓存失效,通过消息队列发送信息通知后台线程更新缓存,后台线程收到消息后,先判断缓存是否存着,不存在立刻读取数据库更新缓存。业务线程发现请求的数据不在redis中,就加个互斥锁,保证同一时间只有一个请求构建缓存,缓存构建完成后释放锁。大量恶意请求访问不存在的数据的时候,在API入口处判断请求参数是否合理(非法值,请求字段是否存在),判断恶意直接返回错误,避免进一步访问缓存和数据库。缓存中的热点数据(被频繁访问的数据)过期了,大量请求直接访问数据库,数据库被高并发的请求冲垮。
2024-03-19 16:20:58
332
原创 Object类方法
默认情况下,这个方法比较的是两个对象的引用是否相同,但是通常会在子类中重写这个方法以实现自定义的相等性比较。要实现clone()方法,类必须实现Cloneable接口,并且重写clone()方法。finalize(): 在对象被垃圾回收之前调用,可以重写此方法来执行资源释放等清理工作。notify(), notifyAll(), wait(): 这些方法用于线程同步和通信。hashCode(): 返回对象的哈希码。getClass(): 返回对象的运行时类。getClass(): 返回对象的运行时类。
2024-03-03 18:18:21
243
1
原创 COW写时复制
其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。redis持久化:RDB(一种基于快照的持久化方式)。
2024-01-30 19:39:35
178
原创 redis持久化机制
RDB(Redis DataBase)持久化是一种基于快照的持久化方式。在指定的时间间隔内,如果满足一定条件(如某段时间内发生的写操作次数),Redis会生成一个包含当前内存数据的RDB文件。RDB持久化提供了较高的数据压缩率和快速的数据加载速度,但可能存在一定程度的数据丢失。AOF(Append Only File)持久化是一种基于日志的持久化方式。当Redis重新启动时,可以通过重放AOF文件中的命令来恢复数据。Redis提供了2种不同形式的持久化方式:RDB和AOF。
2024-01-30 19:20:31
161
原创 JVM,JRE,JDK的区别和联系简洁版
先看图利用JDK(调用JAVA API)开发JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
2024-01-09 19:50:34
857
原创 mysql索引覆盖
索引覆盖:一种查询优化技术,在查询过程中到数据页来获取查询结果。简单来说,当一个查询需要返回的数据列都包含在一个或多个索引(联合索引)中时,就可以利用索引覆盖来避免额外的磁盘读取操作。从而提高查询性能。第一条查询语句需要进行回表查询。通过辅助键查询找到对应的主键,再通过主键找到对应的数据行。第二条查询语句通过索引覆盖,不需要进行回表查询,提高查询性能。
2024-01-03 14:27:42
408
原创 mysql聚簇索引和非聚簇索引
聚簇索引和非聚簇索引的区别:叶节点是否存放一整行记录。:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据。:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置。InnoDB主键使用的是聚簇索引,MylSAM不管是主键索引,还是二级索引(辅助键索引)都使用的都是非聚簇索引。
2024-01-02 19:07:54
458
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人