- 博客(20)
- 收藏
- 关注

原创 美团一面面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制
把所有的引用关系看作是一张图,从一个节点GC ROOT(线程栈的本地变量、静态变量、本地方法栈的变量等等)开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后。剩余的节点则被认为是没有被引用到的节点,既可以当作垃圾。在我们的ThreadLocal类有一个静态内部类,叫做ThreadLocalMap,用键值对的形式存储每一个线程的变量副本,ThreadLocalMap中元素的key为当前ThreadLocal对象,而value对应线程的变量副本。
2024-05-16 16:05:59
1139
原创 Hashmap 和 hashtable ConcurrentHashMap 区别
HashTable使用的是Synchronized关键字修饰,ConcurrentHashMap是JDK1.7使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。ConcurrentHashMap中的synchronized只锁定当前链表或红黑树的首节点,只要hash不冲突,就不会产生并发,效率有提示N倍。ConcurrentHashMap底层是数组+链表/红黑树。
2024-08-20 15:59:34
323
1
原创 MYSQL如何实现事务?
redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,而undo log不同,它主要记录的是逻辑日志。当事务回滚的时候,通过逆操作来恢复数据,若删除一条数据,就会在undo log日志文件中新增一条delete语句,如果发生回滚则执行逆操作。
2024-08-16 13:44:43
1567
原创 JVM-类加载器、双亲委派模型
由于是双亲委派机制,java.lang.String的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有main方法。类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。如果加载的类在上级找到,则子加载器不用加载,例如String类。对类的静态变量,静态代码块执行初始化操作。
2024-08-15 01:00:00
398
原创 JVM-运行数据区(堆、栈、元空间)
每个线程运行时所需要的内存,成为虚拟机栈,先进后出每个栈由多个栈帧组成,对应这每次方法调用时所占的内存每个栈帧只能有一个活动栈帧,对应着当前正在执行的那个方法。
2024-08-14 19:09:15
1104
原创 美团一面面经:线程池->事务
在实际使用中 线程是很占系统资源的,因此大多数并发框架都会使用线程池来管理线程1.使用线程池可以重复利用已有的线程执行任务,避免线程在创建时造成消耗2.由于没有线程创建和销毁时的消耗,可以提高系统响应速度3.通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行数量的大小等首先我们可以大致的了解一下线程池的主要核心原理首先 就是创建一个池子,里面是空,提交任务的时候,池子会创建新的线程对象,任务执行完毕,线程归还给池子。下次再次提交任务时,不需要创建新的线程,直接复用已有的线程即可。
2024-05-16 17:51:44
566
原创 美团一面面经:索引:数据结构B+树->索引失效->索引的设计原则
索引是存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查询速度,提高数据库的性能,核心思想 空间换取时间1.创建唯一性索引,保证数据库表中每一行数据的唯一性2.大大加快数据的检索速度,这也是创建索引的最主要原因3.加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
2024-05-16 17:00:31
756
原创 美团一面面经:Spring生命周期的具体详细过程,三级缓存的设计原理
问的是三级缓存原理 但是此处文章扩展了总的来说 我们springbean 的生命周期无非就四步实例化、属性赋值(也叫依赖注入)、初始化、销毁我们本文在上篇的基础上进行简略概述 并且把重点放在bean是如何进入单列池的。也就是初始化阶段。
2024-05-16 15:25:10
772
原创 Redis之双写一致性篇
!本文章为学习笔记问题:redis作为缓存,mysql的数据如何与redis进行同步?双写一致性:当修改了数据库的数据同时更新redis缓存的数据,缓存和数据库必须要保持一致性(强一致性或者最终一致性都行反正就是一致即可)如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据可以通过两次删除缓存来控制脏数据,但是延迟的时机很难把握,所以无法完全杜绝脏数据,不能做到强一致性。
2024-04-17 17:27:28
419
1
原创 异常处理机制原理剖析
配置了自定义的异常处理器后,默认的异常处理器就不会被加载,当配置了<mvc:annotaion-driven/>或配置了注解@EnableWebMvc后,默认的异常处理器和自定义的处理器异常解析器都会被注册 这意味着在启动注解驱动的springmvc后,不仅会启用默认的异常处理器还会注册你自定义的异常处理器(当然你必须自定义了异常处理器),这确保你同时享有默认的异常处理机制和你自己定制的异常处理。HandlerExceptionResolver接口:完成自己自定义的异常处理器。在学习本文章时需了解。
2024-04-16 08:52:07
413
原创 SpringMVC的异常处理机制
异常分为编译时异常和运行时异常,编译时异常我们try-cache进行捕获,捕获后自行处理,而运行时异常是不可预期的,就需要规范编码来避免,在SpringMVC中,不管是编译异常还是运行时异常,都可以最终由SpringMVC提供的异常处理器进行统一处理,这样就避免了随时随地捕获异常的繁琐性。当然除了繁琐之外,我们在进行前后端分离异步开发时,往往返回统一格式的结果给客户端,例如:{"code":200,"message":"","data":{"username":"haohao","age":null}},即
2024-04-16 08:36:33
670
原创 spring boot的自动配置原理
EnableAutoConfiguration又组合了注解@Import(AutoConfigurationImportSelector.class) (该类是importSelector接口的实现类) 该类重写了 String[] selectImports(...)方法,经过层层调用最终得到配置文件。spring boot就能帮我们自动注入一个DispatcherServlet ,并且在方法上为我们声明了@Bean注解 最后将方法的返回值自动注入到IOC容器中。注解,这个注解聚合了。
2024-04-15 09:03:47
618
2
原创 SpringMVC关键组件浅析
匹配映射路径对应的Handler,返回可执行的处理器链对象HandlerExecutionChain对象常用组件:RequestMapping HandlerMapping。
2024-03-15 12:26:30
217
1
原创 Sentinel解决雪崩问题的四种常见方式
微服务调用调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。如上图所示,由于某种原因发生故障,而其它依赖于该服务(服务D)的服务无法正常工作,从而导致这些服务也出现故障,这种连锁反应就称为雪崩效应。
2024-03-12 10:25:02
580
1
原创 Spring Bean的生命周期
Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段,AOP增强功能,后面要学的Spring注解功能等等。
2024-03-11 23:10:38
1078
1
原创 三级缓存的设计原理
这时Spring会先从三级缓存中获取到创建B的工厂,利用这个工厂先创建一个原始状态的B的Bean,并把它提前暴露给A使用,这样就解决了循环依赖的问题。4.UserDao属性注入,需要UserService,从三级缓存获取UserService,UserService从三级缓存移入二级缓存。三级缓存(singletonFactories):单例Bean的工厂池,缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean。3.UserDao实例化对象,但尚未初始化,将UserDao存储到三级缓存;
2024-03-11 22:58:55
646
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人