自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring的循环依赖

同样,B属性赋值的时候发现依赖A,他从缓存里面找A对象。依次从一级到三级缓存查询A,从。,表示A开始实例化了,虽然我这个对象还不完整,但是先曝光出来让大家知道。就需要把B的代理对象创建出来,但是此时。,发现虽然A不完整,但是存在,,并没有存入实例化的对象,发生。,方便后面有机会创建代理对象。创建A实例,实例化的时候。接着A继续属性赋值,顺利。注入就发生在第二步,,A对象创建也完成。

2024-04-05 19:37:43 178

原创 限流的常见算法

当第1个请求到来时,我们记录下当前窗口内的第一个请求的时间firstReqTime,那么之后的请求到来时,先判断是否进入下一个窗口。而令牌桶则是以一个恒定的速率往桶中放入令牌,在桶中令牌用完之前,并不限制处理请求的速率。滑动窗口法以每一个请求为窗口结束期,向前截取intervalWindow长度,检查该范围内的请求总和,相当于会为每个请求开辟一个新窗口。也就是说,在10:00:59-10:01:01的短短几秒内,共有199个请求到来,可能会瞬间压垮我们的应用。当桶满时,会丢弃生成的令牌。

2024-03-18 20:23:40 310

原创 RDB与AOF

手动执行一次保存操作saveredis是不同客户端发送来四个指令 set set save getsave指令的执行会有可能长时间阻塞,所以线上环境不建议使用。

2022-08-19 20:56:40 349 1

原创 SpringMVC执行流程

2、调用处理器映射器,根据url匹配一个handler处理器。视图解析器 ViewResolver:进行视图的解析,根据视图逻辑名将ModelAndView解析成真正的视图(view)视图View:View是一个接口, 它的实现类支持不同的视图类型,如jsp,freemarker,pdf等等。3、处理器映射器把处理器执行链对象返回给DispatcherServlet。5、处理器适配器去调用执行处理器Handler(Controller类)10、前端控制器对view进行渲染视图(将模型数据填充至视图中)...

2022-08-12 21:38:57 406

原创 AOP相关概念

b、连接点(JoinPoint):程序执行过程中某个特定的点(某个特定的点执行方法)。g、引入(Introduction):在运行时给一个类生命额外的方法或者属性,不需要为类实现一个接口就能使用接口中的方法。e、目标对象(target object):被一个或者多个切面所通知的对象,即业务中需要进行增强的业户对象。缺陷:不能直接代理Java类,必须实现某个接口的类 (2)、CGLIB动态代理。a、切面(Aspect):是类,是对横切关注点的抽象 (通知和切入点的结合)...

2022-08-11 11:26:47 274

原创 JDK动态代理与CGLIB动态代理

CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑。利用参数被代理对象的类加载器和被代理对象实现的所有接口生成指定的代理类—>获取代理类的构造函数对象---->根据代理类的构造函数对象来创建需要返回的代理类对象。JDK 动态代理只能对接口进行代理,不能对普通的类进行代理,这是因为 JDK 动态代理生成的代理类,其父类是 Proxy,且 Java 不支持类的多继承。..

2022-08-11 11:14:25 579

原创 Web会话跟踪技术

客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。一个用户的所有请求都属于同一个会话对同一个用户向服务器发送请求以及服务器进行响应的过程的监视。

2022-08-07 16:55:09 299

原创 Servlet内部实现与接口解析

如果在类中覆盖了GenericServlet抽象类的init()方法,那么程序员就必须手动的去维护ServletConfig对象了,还得调用super.init(servletConfig)方法去调用父类GenericServlet的初始化方法来保存ServletConfig对象,这样会给程序员带来很大的麻烦。1、为Servlet接口中的所有方法提供了默认的实现,则程序员需要什么就直接改什么,不再需要把所有的方法都自己实现了。所以,如果我们需要实现具体的服务逻辑,不再需要覆盖service方法了,...

2022-08-04 11:52:52 122

原创 Servlet工作过程和生命周期

getServletInfo( ),这个方法会返回Servlet的一段描述,可以返回一段字符串。getServletConfig( ),这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象。

2022-08-04 11:42:27 235

原创 #{} ${} 解析

例如在使用排序时ORDERBY${id},如果使用#{id},则会被解析成ORDERBY“id”,这显然是一种错误的写法。,预编译是提前对SQL语句进行预编译预编译完成之后,,调用PreparedStatement来赋值,在某些特殊场合下只能用${},不能用#{}。调用Statement来赋值。为什么#{}可以有效防止sql注入?Mybatis在处理#{}的时候会。,从而避免了潜在的安全风险。,可以防止sql注入。...

2022-08-02 12:24:22 180

原创 MySQL索引与两种引擎的索引实现

是在数据库表的字段上添加的,,它是一种相当于一本书的目录,缩小扫描范围存在的一种机制。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)例如如果没有给name创建索引,,效率低下。...

2022-07-25 13:33:37 231

原创 ReentrantLock

与sys相比,它具有如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量与sys一样,支持可重入。

2022-07-21 11:32:57 126

原创 线程池创建与使用

通过重复利用已创建的线程降低线程创建和销毁造成的消耗。。当任务到达时,任务可以不需要等到线程创建就能立即执行。。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。...

2022-07-20 11:52:23 955

原创 linux下载mysql8

第一步:下载mysql随便一个目录下都行,反正一会儿会移动第二步:解压第三步:重命名第四步:移动第五步:查看第六步:新建MySQL用户、组及目录分别执行下面三步:输入你要设置的密码第七步 :创建MySQL数据仓库目录依次执行下面三个命令第八步 :修改my.cnf文件将原来的内容替换为:第九步 :MySQL初始化第十步 :MySQL启动执行下面两个命令第十一步 :使用命令行登录 MySQL就成功了:...

2022-07-14 11:04:57 1027 2

原创 内存溢出与内存泄漏

在程序运行中,无法申请到足够的内存资源虚拟机栈 本地方法栈 堆 方法区 都会产生OOM内存中加载的数据量过于庞大,如一次从数据库取出过多数据;代码中存在死循环或循环产生过多重复的对象实体;集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;启动参数内存值设定的过小解决方案第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数)第二步,检查错误日志第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。第四步,使用内存查看工具动态查看内存使用情况其中第三步检查对数

2022-06-30 12:32:00 189

原创 G1垃圾回收器

1.同时注重吞吐量和低延时 ,默认暂停目标 200ms**2.**超大堆内存,将堆划分为多个大小相等的Region(区域)(值:1、2、4、8)每个区域都可以作为伊甸园幸村区老年代**3.**整体上是标记+整理算法,两个区域之间是复制算法会stw新创建的对象放到伊甸园,当放满,触发新生代的垃圾回收新生代内存紧张,把伊甸园中存活的对象复制到幸存区幸存区内存比较多了 对象存活年龄超过阈值,又会触发新生代垃圾回收一部分晋升到老年代不够年龄的复制到另一个幸存区新生代垃圾回收+并发标记在YongG

2022-06-29 15:55:08 139

原创 CMS详解

以获取最短回收停顿时间为目标场景:目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求特点:针对老年代采用标记-清除法清除垃圾;基于"标记-清除"算法(不进行压缩操作,产生内存碎片);以获取最短回收停顿时间为目标优点:并发收集、低停顿垃圾收集线程与用户线程(基本上)可以同时工作缺点:1.对CPU资源非常敏感因为并发标记和并发清除都是和

2022-06-29 15:44:30 2947

原创 类加载器与双亲委派

站在Java虚拟机的角度来看,只存在两种不同的类加载器一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现[1],是虚拟机自身的一部分;另外一种就是其他所有的类加载器,这些类加载器都由Java语言实现,独立存在于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。启动类加载器 (Bootstrap ClassLoader),由C++实现,没有父类。主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和

2022-06-18 17:29:42 129

原创 类加载过程

加载链接 : 验证、准备、解析初始化如果这个类还有父类没有加载,先加载父类加载和链接可能是交替运行的在加载阶段,Java虚拟机需要完成以下三件事情:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入 口将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有:_java_mi

2022-06-18 17:20:49 69

原创 计算机网络总结

连接不同的物理设备,传输比特流。该层为上层协议提供了一个传输数据的可靠的物理媒体。简单的说,物理层确保原始的数据可在各种物理媒体上传输作用:为网络层提供可靠的数据传输数据的成帧 :把网络层数据报加头 尾,封装成帧流量控制: 控制发送的传输速度,使得接收方来得及接收, 传输层TCP也有流量控制功能,但TCP是端到端的流量控制,链路层是点到点(比如一个路由器到下一个路由器)数据的检错: 接收者检测错误,如果发现差错,丢弃该帧方法:奇偶校验码-局限性:出错两位,检测不到== 循环冗余检验码CPC==:根

2022-06-08 15:39:50 102

原创 TCP三次握手与四次挥手

TCP重要标志位 ,1表示:ACK :1/0 确认信号有效SYN :1/0 要发起一个连接FIN : 1/0 要结束一个连接TCP/IP协议是传输层的一个面向连接的安全可靠的传输协议。三次握手的机制是为了保证能建立一个安全可靠的连接;第一次握手是由客户端发起,客户端会向服务端发送一个报文,报文里面SYN标志位是置1的,当服务端收到这个报文的时候就知道客户端要和我发起一个新的连接,于是服务端就向客户端发送一个确认消息包ACK位置1,以上两次握手之后,对于客户端而言,其实是已经知

2022-06-08 10:48:17 103

原创 hashmap面试题总结

主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到9个(阈值8):如果此时数组长度大于等于 64,则会触发链表节点转红黑树节点;而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容,因为此时的数据量还比较小。对于移除,当同一个索引位置的节点在移除后达到== 6 个,并且该索引位置的节点为红黑树节点,会触发红黑树节点转链表节点==阈值为8是在时间和空间上

2022-06-06 15:56:27 115

原创 同步模式异步模式

定义:Guarded Suspension 用在一个线程等待另一个线程的执行结果要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果源源不断的从一个线程到另一个线程,可以使用消息队列(生产者消费者)JDK中join Future的实现,采用这个模式因为要等待另一方的结果,归类到同步模式例子:线程一等待线程二的结果优化:不能无限制的等待测试最长等待2s但是下载需要3s等待两秒就不再等待了,不需要产生结果和消费结果的线程一一对应消费队列可

2022-06-03 11:37:39 231

原创 wait notify的正确使用

Wait notify分析:T1获得了锁,正在干活,调用wait方法,T1到休息室(Waitset)并释放锁其他线程获得锁执行。T2获得锁,调用notify通知T1干活,T1就到EntryList(blocked)继续竞争锁调用wait方法,就进入了waitset,变为waiting状态blocked与waiting都是阻塞,不占用cpu时间片分析:API介绍:obj.wait() 让进入obj监视器的线程到waitset等待(调用wait(0):无限制等待)obj.wait(lo

2022-05-30 18:38:27 246

原创 线程基础部分

一、基本概念进程:进程是指运行中的程序,比如使用qq,就启动了一个进程,操作系统为该进程分配内存空间是动态过程,有自身的产生、存在、消亡的过程线程:由进程创建,是进程的一个实体一个进程可以有多个线程,比如迅雷同时下载多个文件单线程:同一时刻,只允许执行一个线程多线程:同一个时刻,可以执行多个线程,比如一个qq进程同时打开多个聊天窗口并发:同一个时刻,多个任务交替执行,“貌似同时”。单核cpu实现的多任务就是并发并行:同一个时刻,多个任务同时执行,多核cpu可以实现并行cpu1执行

2022-05-29 11:33:33 74

原创 方法区与运行时常量池

方法区所有java虚拟机中线程共享的一块内存方法去是一个概念上的东西,他的实现叫做永久代,或者元空间这里偷了一张黑马程序员的图片注意:1.8之前,方法区的实现叫做永久代,使用了堆内存的一部分1.8以后,把永久代从堆内存中移除了,换了个实现,叫做**元空间,**用的就不是堆中的内存了,用的就是操作系统的内存存储:存储了跟类的结构有关的信息(运行时常量池,成员变量,方法数据,成员方法,构造器方法的代码部分)方法区也会产生内存溢出问题组成:1.6之前用的永久代作为方法区的实现永久代里包括

2022-05-06 19:56:16 799

原创 JVM内存结构

JVM虚拟机种的内存结构分了五个部分:程序计数器虚拟机栈本地方法栈堆方法区程序计数器记住下条二进制字节码的指令(.class文件中的指令)地址注意:取出下一条jvm指令 需要解释器解释成机器码,才能被cpu执行线程私有(每个线程都有自己的程序计数器)不会存在内存溢出二、虚拟机栈线程运行所需要的内存空间每个线程一个栈(线程私有)栈中由多个栈帧组成一个方法一个栈帧对应着每个方法的调用(每个方法需要的内存)存放着方法执行调用的数据栈帧包括:局部变量表,操作数栈,返回地址,动态链

2022-05-05 17:44:03 106

原创 grub rescue

调整磁盘分区的时候出现失误,电脑重启的时候出现了error:unknow filesystemgrub rescue>系统无法进入应该是由于分区调整改变了grub1.先查看分区ls2.寻找分区用ls (hd0,msdos1)/ 命令全部找一遍,直到某个不是unknow。 我的是(hd0,msdos6)3.修改启动项grub rescue>root=(hd0,msdos6)grub rescue>prefix=/boot/grubgrub rescue&gt

2022-05-02 13:02:03 1051

原创 .class文件结构与反编译

根据JVM规范注:un : n个字节info :表1、魔数0~3个字节,表示它是否是【class】类型的文件ca fe ba be2、版本4~7字节,表示类的版本 00 34(52)表示的是java 800 00:小版本号00 34:主版本号3、常量池8~9字节,表示常量池长度,00 23(35)表示常量池有#1~#34,注意#0项不计入,也没有值简要分析:第#1项 0a表示一个Method(方法)信息, 接下来的4个字节代表方法信息 00 06和 00 1

2022-05-01 09:03:04 1151

原创 Map接口总结与HashMap源码分析

Map接口1.Map,用于保存K-V(双列元素)2.Map中的Key Value可以是任意引用分类型的数据,会封装到HashMap的Node对象中3.Map的key不允许重复。原因和HashSet一样。4.Map中的value可以重复5.Map的key可以为null,value也可以为null。6.常用String类作为Map的key7.key value一对一,通过指定的key可以得到value8.Map存放数据的key-value示意图,一对k-v是放在HashMap$Node中的,因为

2022-04-22 12:13:09 534 2

原创 HashSet源码分析

HashSet的全面说明1.实现了Set接口2.实际上是一个HashMap,源码3.可以存放null,只能有一个4.不保证元素是有序的(取出顺序固定 ),取出hash后,在确定索引的结果5.不能有重复对象模拟底层存储结构(数组+链表)基础使用public class HashSet01 { public static void main(String[] args) { HashSet<Object> set = new HashSet<&

2022-04-21 15:22:40 802

原创 LinkedList Vector基本源码分析

Vector底层是对象数组线程同步,线程安全无参构造,默认为10,满了后,按照2倍扩容指定大小,满了后,直接按照两倍扩容1.无参构造的时候:这里看到,无参构造默认空间为102.执行add方法的时候这里说一下:synchronized是保证线程安全的ensureCapacityHelper:这个方法判断是不是要扩容;第一次执行的时候minCapacity=1;(0+1)3.我们看一下这个方法的源码:elementData.length为10.(无参构造,默认为10)1<

2022-04-20 17:01:05 553

原创 ArrayList源码分析

ArrayList底层和源码分析先说结论:1.ArraryList中维护了一个Object类型的数组elementData transient Object[] elementData;2.创建对象的时候如果是无参构造,初始容量为0,第一次添加的时候,扩容为10,如果需要扩容 1.5倍3.如果是指定大小的构造器,初始容量为指定的大小。如果需要扩容,直接扩容大小为1.5倍public class ArrayListSourre { public static void main(String

2022-04-19 21:02:56 200

原创 数据结构引入以及常用的内存开销

最近复习了一下数据结构,就做个随笔吧。有一些自己的思考,因笔者水平有限,也不一定完全正确。望读者指正数据结构就是数据在内存中的存储方式。按照物理的结构来分(也就是数据在内存中的存储方式),也就分为了顺序存储结构和链式存储结构。按逻辑结构来分,分为了集合结构、线性结构、树性结构、图性结构算法的时间复杂度:大O记法O(f(n))先说结论:1.用常数1来取代运行中的常数2.只保留最高阶3.去除最高阶的常数因子例子:3 O(1)n+3 O(n)n^2+2

2022-04-18 18:08:09 667

转载 Java方法区,程序计数器

转自方法区保存在着被加载过的每一个类的信息;这些信息由类加载器在加载类的时候,从类的源文件中抽取出来;static变量信息也保存在方法区中;可以看做是将类(Class)的元数据,保存在方法区里;方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,则应该只有一个线程去加载类,让其他线程等待;方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。jvm也可以允许用户和程序指定方法区的初始大小,最小和最大限制;方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展Ja

2021-04-06 18:58:01 177

原创 深入理解栈帧

1.栈中可能出现的异常Java虚拟机规范允许Java栈的大小是动态的或者是固定不变的。如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常。如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError 异

2021-04-01 19:34:24 667

原创 堆对象死亡判断

引用计数法:给对象添加一个引用计数器,每当有一个地方引用它,计数器值就加一;相反的,当引用失效的时候,计数器值就减一;任何时刻计数器为0的对象就是不可能再被使用的,这个对象就可以被回收了问题:除了需要额外的空间来存储计数器,以及繁琐的更新操作,引用计数法还有一个重大的漏洞,那便是无法处理循环引用对象例子:举个例子,假设对象 A 与 B 相互引用,除此之外没有其他引用指向 A 或者 B。在这种情况下,A 和 B 实际上已经死了,但由于它们的引用计数器皆不为 0,在引用计数法的心中,这两个对象还活着。

2021-04-01 15:29:40 80

原创 GC(一)

线程私有区域伴随线程的产生而产生,一旦线程终止,私有内存区也会自动消除;而Java堆和方法区这两个区域是线程共享的,这部分内存的分配和回收是动态的;所以GC关注的是这部分的内存如何管理JVM在进行GC的时候,并不是对三个区域统一回收。大部分的时候,回收都是在新生代新生代幸存区(from/to)老年区GC两种类:轻GC(普通GC)、重GC(全局GC)GC题目:1.JVM内存模型和分区~详细到每个区放什么?2.堆里面的分区有哪些?Eden、from、to、老年区,说说他们的特点?3.GC算法有

2021-03-31 18:19:59 160

原创 JVM小结

垃圾存在于堆与方法区中,栈中不会存在垃圾,所以平时说的调优就是调堆一.类加载器当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class"的文件,".class"文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个.

2021-03-30 20:49:37 103 1

原创 堆内存泄漏(OOM)分析工具

插件下载:第一种:可以在idea中直接下载插件第二种:官网下载jpro解压缩后 将文件放在D:\idea\IntelliJ IDEA 2020.1\plugins中(idea的plugins文件夹内)重启idea:最后:可视化工具下载:推荐下载11.0版本的(网上很少有12的序列号)jprofiler...

2021-03-30 20:45:14 637

空空如也

空空如也

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

TA关注的人

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