-
ThreadLocal如何实现,以及在多线程复用情况下为何会出现内存泄漏
- 每个Thread对象中都有一个ThreadLocalMap对象,类似一个map,以key-value形式保存数据,用ThreadLocal做为key。
- 多线程复用的时候每个线程的Threadlocal如果没有调用remove方法,那开始设置的key对应的value会一直存在,但这种情况下可能这个value也已经没用了,但是还不能被GC回收掉。
-
ThreadLocal使用不当导致oom的案例
- 有一个threadlocal中保存了一个list,用于保存代码执行中的操作步骤(埋点),每经过一个方法的执行就需要在list中记录一下信息,后续把所有的信息保存到日志系统中,并清除list中的数据。而清除list内容的jar包为另一个没有引入,导致每次list中的数据一直在增加,最终oom。
-
io多路复用
- 同一个线程同时处理多个io请求
-
redis的链地址法
-
redis zset使用跳跃链表而不用红黑树
- 红黑树操作负责操作和删除需要调整树
- 红黑树不适合做范围查询(需要使用中序遍历)
-
redis分布式锁-redlock
- 获取当前时间戳为时间
- 轮流尝试在每个master节点上获取锁,过期时间为10秒,超时时间设置50ms
- 尝试在大多数节点上建立锁,一般为n/2+1个节点
- 客户端计算创建锁的时间,如果建立锁的时间小于超时时间,那么就是创建成功
- 否则为创建失败,创建失败需要将之前的锁删除。
- 只要存在分布式锁。另外的线程就需要轮询尝试重新获取锁。
-
spring中beanFactory与factoryBean的关系
- FactoryBean 而言,这个 Bean 不是简单的 Bean ,而是一个能生产或者修饰对象生成的工厂 Bean, 它的实现与设计模式中的工厂模式和修饰器模式类似。
- 一般情况下,Spring 通过反射机制利用 的 class 属性指定实现类实例化 Bean ,在某些情况下,实例化 Bean 过程比较复杂,如果按照传统的方式,则需要在 中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。 Spring 为此提供了一个 org.springframework.bean.factory.FactoryBean 的工厂类接口,用户可以通过实现该接口定制实例化 Bean 的逻辑。
-
spring 如何解决循环依赖
- Spring通过将实例化后的对象提前暴露给Spring容器中的singletonFactories,解决了循环依赖的问题。
-
mysql调优方式
- 建表时适当添加冗余字段,减少连表操作
- 利用查询缓存,每次查询的sql一样就会适用mysql自建缓存,如果查询的时候sql会随着时间变化就无法使用到缓存
- 经常需要在查询sql中用于where条件的字段添加索引
- 不需要查询的列不要添加减少磁盘io
- 利用索引覆盖,如需要查询的列都在索引中能取到就不需要回表
- 建立联和索引时把区分度最高的列放在索引的最左边,联合索引是用的最左匹配原则,适当调整sql写法。
- 索引下推是官方进行的优化:是在索引遍历的过程中,对索引中所包含的字段先进行判断过滤,过滤掉不符合条件的数据,减少回表的次数,在mysql5.6之前这种情况只能每条数据回表找出数据在进行列值比较。
- 建立前缀索引:某些列字段可能中间某一部分才有区分度,可以定义一部分字符串作为索引
- 不要在where条件字段使用函数操作会使索引失效
- 连表时两个字段字符集不同也会使索引失效
-
es分页
- from+size浅分页:使用from偏移量,size数据大小来分页,如果es数据有多个分片,则会对每个分片取相同数量的数据,然后集合在一起再进行排序取分页数据,这种情况如果是后面较深的分页,整体会随着from的增加,系统消耗越大。
- scroll深分页:scroll查询每次查询时会生成一次数据快照,然后根据上一次的查询的id来进行下一次查询。scroll不支持跳页查询。不能查询到实时数据。
- search_after:在排序的基础上,基于上一笔的sort值,查询排在它之后的数据,以此来实现分页,该查询为无状态的。总是查询出es中的最新数据。同样无法进行跳转到指定页。
-
spring boot特点
- 可以独立运行spring容器,内嵌tomcat
- 简化依赖,配置各种starter
- 自动配置
- 依赖@EnableAutoConfiguration引入nableAutoConfigurationImportSelector,这个类会去读取一个spring.factories下key为EnableAutoConfiguration对应的全限定名的值,加载到spring容器中,实现自动装配。