美团Java后端(三)

链接:https://www.nowcoder.com/discuss/637431?source_id=discuss_experience_nctrack&channel=-1

  • redis一般什么场景用

需要实时更新(实时看到订单列表);极其消耗数据库的数据(排行榜,一天统计一次就好);在某个时刻访问量极大而且更新也很频繁的数据(秒杀)

  • 缓存雪崩怎么办

缓存雪崩就是指缓存由于某些原因(比如 宕机)整体崩掉了,导致大量请求到达后端数据库,数据库崩溃,接着整个系统崩溃,发生灾难

事前解决方案:双机房部署,两套Redis Cluster,两套Redis Cluster之间做一个数据同步

事中解决方案:当判断缓存出现问题,则自动进行熔断并按预设进行降级操作

事后解决方案:Redis数据备份和恢复

  • Java怎么判断对象会被回收的

可达性分析算法:从所有的GC Roots开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收

  • 双亲委派模型

双亲委派的意思是如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。链接:https://baijiahao.baidu.com/s?id=1633056679004596814&wfr=spider&for=pc

  • hashmap怎么存储的

基于数组+链表+红黑树来实现的,它的底层维护一个Node数组。它会根据计算的hashCode将对应的KV键值对存储到该数组中,一旦发生hashCode冲突,那么就会将该KV键值对放到对应的已有元素的后面, 此时便形成了一个链表式的存储结构。当链表存储的数据个数大于等于8的时候,不再采用链表存储,而采用了红黑树存储结构。这么做主要是在查询的时间复杂度上进行优化,链表为O(N),而红黑树一直是O(logN),可以大大提高查找性能。

java中TreeSet的数据结构底层就是红黑树

设计红黑树的目的,就是解决平衡树的维护起来比较麻烦的问题

  • 发现Sql查询比较慢怎么办

看下条件字段有没有索引,没有的话建索引。

索引优点:保证数据的唯一性、加快数据的查询速度等

  •  为什么 MySQL 数据库要用 B+ 树存储索引

 B+ 树由于所有数据都在叶子结点,不用跨层(B树要跨),同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。此外,数据库的B+树一般2~4层,意味着查找某一键值最多只需要2到4次IO操作。同样的结点次数红黑树的高度最多为2log(n+1),而B+树的高度最多为(logt (n+1)/2)+1,随着节点增大高度会更小,IO次数也会减少,所以不用红黑树。

B树,多路搜索树,设计多路进一步降低树的高度,一般用来做文件系统的索引,文件系统存在硬盘上,要把一棵树一次性加载到内存

在内存中,红黑树比B树效率更高,但是涉及到硬盘,B树更优

B+树是在B树基础上,数据都在叶子节点上,同时叶子节点之间加了指针形成链表

  • ThreadLocal知道吗

操作的是自己本地内存中的变量,从而规避了线程安全问题

1. Spring框架里面就是用的ThreadLocal来实现这种隔离

2.ThreadLocal内存泄露,ThreadLocal的key使用弱引用(具有弱引用的对象拥有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存,不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。)ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露。

解决内存泄漏:代码的最后使用remove

3.为什么ThreadLocalMap的key要设计成弱引用

key不设置成弱引用的话就会造成和entry中value一样内存泄漏的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值