- 博客(31)
- 收藏
- 关注
原创 git 操作
举例: 如果从 master(A-B) 拉个feature分支出来,然后提交了几个 commit(A-B-C-D),这个时候刚好有人把他开发的东西合并到 master(A-B-E) ,这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面(A-B-E-C2-D2)。撤销某次提交,撤销也是一种提交。merge 会把a分支最新的提交和b分支最新的提交合并成一个新的提交。
2024-05-16 15:47:57
345
原创 Spring解决循环依赖为什么需要三级缓存
如果ServiceA中有@Async 或者@Transactional等 项目启动会报错。为什么呢?因为B依赖A时,执行了A的lambda表达式会创建A的代理对象前,把对象放在earlyProxyReferences中,代表已经进行了aop操作,在执行A的初始化后续操作(BeanPostProcess.postProcessAfterInitialization),会校验earlyProxyReferences中是否执行过aop,如果执行过则不在执行。
2024-04-15 22:55:40
290
原创 SpringBean的生命周期
https://gitcode.csdn.net/65e6e4a31a836825ed78701b.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTI3Mzc3OSwiZXhwIjoxNzEzMjgyMTg5LCJpYXQiOjE3MTI2NzczODksInVzZXJuYW1lIjoiY2hhbmc3NjU3MjEifQ.203_YZH4P2flL6H-FD3tcTbi4G-2ERZfAcwPPVKHDys
2024-04-15 22:17:58
111
原创 【jvm垃圾收集之跨代引用】
目前的垃圾收集器多数都是基于分代收集理论进行的。以Parnew+cms垃圾收集器为例,假设要进行一次新生代的垃圾收集,但新生代的对象是完全有可能被老年代中的对象引用的,为了判断新生代中某个对象是否存活,需要额外遍历整个老年代来确保可达性分析的正确性,反过来也是一样。这种方案固然可行,但同时给垃圾收集带来很大的性能负担。注:不仅新生代、老年代存在跨代引用,G1的rigen之间也存在跨代引用,即所有涉及到部分区域收集的收集器都面临这样的问题。...
2022-08-29 09:23:54
423
1
原创 Redis 主从同步
在讨论主从同步之前先说一个概念,CAPC:Consistency 一致性A:Availability 可用性P:Partition tolerance 分区容错性关系图如下:一位不愿意透露姓名的大佬说:小解释下:分布式系统一般是分布在不同的节点上,而且是网络分区的,这就意味着总有网络不稳定的时候,这种现象大家叫他"网络分区",万一网络波动了,我说万一哈,那两个分布式节点无法通信,主节点的修改操作无法同步到从节点,所以你需要进行二选一:1、停止对主节点的修改功能,即牺牲可用性确保一致性 2 保
2022-07-11 16:47:43
363
原创 springmvc 执行流程
浏览器请求地址:localhost:8080/hello1、请求经过前置控制器(DispatchServlet)DispatchServlet 在服务启动的时候创建 (就是你的web.xml配置的)并进行一些初始化 (initHandlerMappings 、initHandlerAdapters、initViewResolvers这三个看着是不是很熟悉)DispatchServlet其实就是对Servle进行的拓展:DispatcherServlet 继承FrameworkServlet,Frame
2022-07-01 11:58:41
153
原创 【jvm对象生存还是死亡】
对象死了吗?堆中的对象是否应该被回收,首先需要去确认下这个对象是存活还是死亡。如何判断?引用计数法引用计数法即为每个对象添加一个引用计数器,每当有一个地方引用时,计数器++,当引用失效时,计数器–,最终计数器为0时说明对象已经无人引用,即可以被回收。引用计数法实现逻辑简单,效率也很高,但是主流的java虚拟机没有选用该算法进行内存管理的,原因是无法解决循环引用的问题。如:对象A引用B,对象B同时引用A,除此之外没有其他地方引用,实际上这两个对象不可能再被访问,但是因为引用计数器不为0导致无法被回收
2022-04-28 16:01:08
131
原创 2022-04-26 垃圾收集器
jvm 垃圾收集器再忙再累,不忘垃圾分类!!!年轻代(复制算法)Serial 收集器单线程收集器。单线程的意义不仅仅说明只是通过一个cpu或者或者一个线程去完成垃圾收集,更重要的是垃圾收集器在工作时,会暂停其他所有的工作线程(STW:Stop The Word)。优点:client模式的首选,简单高效,没有线程切换的开销。ParNew 收集器Serial收集器的多线程版本。除了使用多线程进行垃圾收集外,其他的功能和Serial收集器基本一致,在实现上二者共用了很多代码。优点:ParNew是很
2022-04-27 16:40:11
68
原创 【redis源码之hash】
深入redis hash (字典)内部数据结构字典是redis中出现最为频繁的一种数据结构,除了hash类型外,redis中所有的key-value 组成一个全局字典,带有过期时间的key和其过期时间也是一个字典。zset集合中存储的value和score也是一个字典。struct RedisDB{ dict *dict;//all keys =>value dict *expires: //all expired key=> time}struct zset{ dict *di
2022-04-15 16:22:42
706
原创 redis源码之字符串
redis源码-字符串结构redis 中的字符串叫SDS (simple dynamic string),结构如下:struct SDS<T>{ T capacity; // 数组容量 T len; // 实际长度 bytes flags; // 特殊标志位 无需关注 byte[] content; // 数组内容 实际存放的值}capacity 和len 有点类似java中的ArrayList。一般来说redis就预分配空间,即capacity &g
2022-04-14 22:06:23
580
1
原创 【2022-04-14 redis key 删除策略】
redis key 删除策略redis将所有设置了过期时间的key放到一个独立的字典中过期删除过期策略:定时删除+惰性删除定时删除贪心策略。每秒进行10次扫描,每次从过期字典中取出20个key,如果过期的数量超过1/4,则重复进行扫描,否则终止。为了防止循环过度,阻塞客户端请求,扫描时间不会超过25ms,即若客户端请求过来时,此时正在执行定时扫描任务,则客户端最大等待的时间为25ms。备注:从节点不会定时扫描,当主节点中的某个redis key过期了,会产生一个AOF指令,从节点通过同步AO
2022-04-14 16:39:01
227
1
原创 【2022-04-11 对象的内存布局】
对象的内存布局对象在内存中可以分为三块区域。对象头+实例数据+对齐填充对象头对象头包括两部分:① mark word:存储对象自身的运行时数据。包括:哈希吗,分代信息,锁的标志位,线程持有的锁,偏向线程id,偏向时间戳。这些信息在32位机器和64位机器上分别占用32bit和64bit。实际上上述信息占用的大小会大于32bit 或者64bit。实际上,mark word是非固定的数据结构,会根据自身的状态复用存储空间(如果未处于锁定的状态,那么25bit用于存储哈希码,4bit存储分代年龄,2用于存.
2022-04-11 21:33:36
242
原创 2022-04-11 对象的创建
java 对象的创建过程虚拟机在遇到一个new 指令时,首先会去常量池中定位到这个类的符号引用,并且检查这个类是否已经被加载、解析和初始化过,如果没有,那必须先进行相应的类加载的过程。类加载检查完成后,开始为对象分配内存内存的分配方式有两种:① 指针碰撞:内存是规整的,用过的内存和空间内存用指针隔开,当需要内存时,只需要移动指针即可。② 空闲列表 :内存不是规整的,使用的内存和空闲内存相互交错,虚拟机通过维护一个列表来记录那些内存是可用的,分配内存时从列表中找到相应大小的内存即可。采用哪种分配方式取
2022-04-11 21:03:48
344
原创 【2022-04-09 jvm 垃圾回收-空间分配担保】
空间分配担保在年轻代发生Minor Gc之前,虚拟机会检查年老代最大连续可用空间是否大于新生代对象的总空间,如果大于,则说明是安全的,可以进行MinorGc如果年老代最大连续可用空间小于新生代对象的总空间,则需要检查下是否允许空间分配担保失败,如果设置为允许,那么虚拟机会继续检查老代最大连续可用空间是否大于历次晋升到老年代对象的平均大小,如果大于,则说明可以进行GC,但是本次GC是有安全的,由于允许空间分配担保,所以可以进行GC如果老代最大连续可用空间小于历次晋升到老年代对象的平均大小 或者 设置不
2022-04-09 18:59:30
361
原创 jvm- 类加载过程
类加载过程1)Loading(载入)JVM 在该阶段的主要目的是将字节码从不同的数据源(可能是 class 文件、也可能是 jar 包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的 java.lang.Class 对象。2)Verification(验证)JVM 会在该阶段对二进制字节流进行校验,只有符合 JVM 字节码规范的才能被 JVM 正确执行。该阶段是保证 JVM 安全的重要屏障,下面是一些主要的检查。3)Preparation(准备)JVM 会在该阶段对类变量(也称为
2021-10-13 19:55:13
81
原创 2021-09-10 springboot 配置log4j2日志,并输出到文件
springboot 配置log4j2日志,并输出到文件1 pom文件 <!-- 引入springboot log4j2依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </depend
2021-09-10 15:35:58
535
原创 spring注入的对象是本身吗
spring注入的对象是本身吗直接上结论1 spring在没有使用aop的时候,注入的是就是对象本身。2 spring很多功能都是通过aop来实现,如果事务,缓存注解,异步、还有一些自定义的aop等等,而aop是通过动态代理来实现的,spring主要用到的动态代理有jdk的动态代理和cglib。3 若被代理的对象实现的接口,则是jdk代理,否则是cglib代理。4 若是aop spring注入的时候需要注入接口经常我们遇到的事务生效或者异步未生效,其中部分原因就是在同一个类中去调用有注解的方法
2021-09-02 17:09:59
555
原创 RcoketMQ 消费mq的两种方式
RcoketMQ 消费mq的两种方式:pull 和 pushpush:消费者注册MassageListener监听器,时刻监听从broke推过来的消息并消费。pull:消费者自己实现取消息的逻辑,首先通过topic取出所有的MassageQueue,遍历所有的MassageQueue,然后从每个MassageQueue中批量取出消息并记录当前队列的offset。区别push实时性高,但是会增加服务的负载,如果push过快,服务端会出问题。pull主动权在消费者手里,可控性好。但实时性不好保
2021-08-31 19:34:11
466
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人