Java 高级面试题

1. 简述分布式锁的几种实现方案 ?
   1.基于数据库实现分布式锁
                直接创建一张锁表,然后通过操作该表中的数据来实现了。
                当我们要锁朱某个方法或资源是,们就在该表中增加一条记录,想要释放锁时候就三处这条记录。
                methodLock(表): id、method_name、desc、update_tiame;method_name 做了唯一约束
   2.基于缓存(redis)实现分布式锁
   3.基于zookeeper实现分布式锁


2. 对外提供的接口如何保证幂等?
        幂等就是让多次重复操作的结果跟一次操作的结果是一样的
        
        1.乐观锁,加上操作时的状态判断,如果状态改变就不操作;
        2.悲观锁,每次操纵i做时候锁住资源,使用一个显式状态去表示操作状态
        3.使用RoaringBitmap做一点过时间范围热数据内的操作记录做内存bitmap去重,从而实现幂等

 加端端老师免费领取更多编程资料


3. 简述一下秒杀系统的设计思路 ?

        

4. JVM堆内存溢出之后,其它线程是否能继续工作? java中什么样的对象能够进入老年代,GC的过程 什么情况下发生fullGC,怎么避免发生fullGc 
        答:还能运行,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行,该线程持有的对象占用的heap都会被gc了,释放内存。
            因为发生OOM之前进行gc,就算其他线程能够正常工作,也会因为频繁的gc产生较大的影响。
                
                
        java中什么样的对象能够进入老年代
                分代年龄=-XX:MaxTenuringThreshold指定的大小时,对象进入老年代
                大对象和大数据组会进入老年代
                
                
                
        什么时候会触发Full GC
                1.调用System.gc()
                  只是建议虚拟机执行full GC,但是虚拟机不一定真正去执行。不建议使用这种方式,而是让虚拟机管理内存。
                  
                2.未指定老年代和新生代大小,堆伸缩时会产生fullgc,所以一定要配置 -Xmx、-Xms

                3.老年代空间不足
           老年底空间不足的常见场景比如大对象、大数组直接进入老年代、长期存活的队形进入老年代等。
           为了避免以上原因引起FullGC,应尽量不要创建过大的对象以及数组。
                   除此之外,可以通过-Xmn虚拟机参数调大新生代的大小,让对象尽量再新生代被回收掉,不进入老年代。
                   还可以通过-XX:MaxTenuringThreshold调大对象进入老年代的年龄,让对象在新生代多存活一段时间

                4.JDK1.7及以前的(永久代)空间满   
                        
        
                怎么调优

                围绕一个点,策略就是尽量把对象在新生代使用回收,减少晋升老年代的几率
        

5. left join查询时,左右表过滤分别采用什么方式比较合理? Mysql innodb索引为什么不用hash、 二叉、 红黑 数据结构而采用B+Tree 
        left join 左侧的表为主
        right join 右侧为主表
        inner join 查找额数据时左右表两张表共有的
        
        时因为B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数,降低IO、提升性能

6. 消息队列如何做到消息幂等性? 
        1.利用数据库唯一约束事项幂等
        
        2.利用reis的原子性:每次操作都直接set 到redis里面,然后将redis数据定时同步数据库中
        
        3.多版本(乐观锁)控制
        
        4.token机制:生产者发送每条数据的时候,增加一个全局唯一的id,这个id通常业务的唯一标识,比如订单编号。消费端消费时,则验证该id是否被消费过,如果还没有消费过,则进行处理。等处理结束后,、
                                在把id存入redis,同时设置状态已消费。如果已经消费过了,则不进行处理。

7. 简述一下API接口限流的思路 
        漏桶算法:洪峰
        
        令牌桶算法:限流 (秒杀,抢购)

  加端端老师免费领取更多编程资料

8. 尽可能多的列举出你所知道的Redis使用场景和用到的数据结构 

        1.String(字符串):说是字符串但它内部结构更像时一个ArrayList,内部维护着一个字节数组,并且在其内部预分配一定的空间,以减少内存的频繁分配。
                                          Redis 的内存分配机制是这样(字符串的最大长度为512M):
                                          当字符串的长度小于1MB时,每次扩容都是加倍现有的空间。
                                          如果字符串超过1MB时,每次扩容时只会扩展1MB的空间。
        
        应用场景:存储key-value键值对
        
        2.list(列表):链表结构,list的插入和删除操作非常快,时间复杂度为0(1),
        应用场景:由list它是一个按照插入顺序的列表,所以应用场景还比较多,比如:
                 消息队列:
                         朋友圈的点赞列表、评论列表、排行榜
                         
        3.hash(字典)
         应用场景:
          存储对象:hash类型的结构与对象的结构相似也可以用来存储对象
          

        4.set(集合):Redis中的set和Java中的HashSet有些类似,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL。当集合最后一个
                                元素被移除之后数据结构被自动删除,内存被回收。
        应用场景:
      存放需要去重一些数据:比如存储某活动中中奖的用户ID,因为有去重功能,可以保证同一个用户不会中奖两次        


        5.zset(有序集合):zset也叫SortSet一方面它是个set,保证了内部value的唯一性,另方面它可以给每个value赋予一个score,代表这个value的排序权重。它的内部实现用的是一种“跳跃列表”的数据结构。        
          应用场景:
          可以用做排行榜
          可以用来存储学生的成绩

9. 如何保证缓存与数据库的双写一致性? 
        缓存+数据库读写的模式,就是Cahe Aside Pattern
        
        读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
        更新的时候,先更新数据库,然后再删除缓存。

    最初级的缓存不一致问题及解决方案:
        问题:先修改数据库,再删除缓存,如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。
        解决思路:先删除缓存,再修改数据库。如果数据库修改失败了,那么数据中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。

        比较复杂的数据不一致问题分析
        
        


10. 什么是缓存雪崩?如何解决? 
              描述:大量的热点key设置了相同的过期时间,导在缓存在同一时刻全部失效,造成瞬时数据库请求量大、压力剧增,引起雪崩,甚至导致数据库被打挂。缓存雪崩其实有点像“升级版的缓存击穿”,缓存击穿是一个热点key,缓存雪崩是一组热点key。解决方案:1.      过期时间打散。既然是大量缓存集中失效,那最容易想到就是让他们不集中生效。可以给缓存过期时间加上一个随机时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。2.      热点数据不过期。该方式和击穿一样,也是要着重考虑刷新的是时间间隔和数据异常如何处理的情况。3.      加互斥锁。该方式和缓存击穿一样,按key维度加锁,对于同一个key,只允许一个线程计算,其他线程原地阻塞等待第一个线程的计算结果,然后直接走缓存即可。

11. 什么是缓存穿透?如何解决? 描述:访问一个缓存和数据库都不存在的key,此时会直接打到数据库上,并且查不到数据,没法写缓存,所以下一次同样会打到数据库上。    此时,缓存起不到作用,请求每次都会走到数据库,流量大时数据库可能会被打挂。此时缓存就好像被”穿透”了一样,起不到任何作用。 解决方案:1.      接口校验。在正常业务流程中可能会存在少量访问不存在key的情况,但是一般不会出现大量的情况,所以这种场景最大的可能性是遭受了非法攻击。可以在最外层先做一层校验:用户鉴权、数据合法性校验等,例如商品查询中,商品id是正整数,则可以直接对非正整数过滤等等。2.      缓存空值。当访问缓存和DB都没有查询到值时,可以将空值写进缓存,但是设置较短的过期时间,该时间需要根据产品业务特征性来设置。
3.      布隆过滤器。使用布隆过滤器存储所有可能访问的key,不存在的key直接被过滤,存在的key则再进一步查询缓存和数据库。


12. 简述一下Spring AOP与AspectJ的不同之处 
            Spring AOP与AspectJ的目的一致,都是为了统一处理横切业务,但与AspectJ不同的是,Spring Aop 并不尝试提供完整AOP功能(即使它完全可以实现),Spring AOP更注重的是与Spring IOC容器结合,并结合该优势来解决横切业务的问题,因此在AOP的功能完善方面,相对来说AspectJ具有更大的优势。同时,Spring注意到AspectJ在AOP的实现方式上依赖于特殊编译器(ajc编译器),因此Spring很机智回避了这点,转向采用动态代{过}{滤}理技术的实现原理来构建Spring AOP的内部机制(动态织入),这是与AspectJ最根本的区别。

13. 列举一下MyBatis中使用到的设计模式及相关类名 
1.      Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;2.      工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;3.      单例模式,例如ErrorContext和LogFactory;4.      代{过}{滤}理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代{过}{滤}理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;5.      组合模式,例如SqlNode和各个子类ChooseSqlNode等;6.      模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;7.      适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;8.      装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;9.      迭代器模式,例如迭代器模式PropertyTokenizer;


14. ElasticSearch中文与拼音的搜索联想如何实现? 

15. Thread类中start()和run()方法有什么区别? 在并发情况下,Elasticsearch如果保证读写一致? Elasticsearch是如何实现Master选举的?怎么避免脑裂问题? 

  加端端老师免费领取更多编程资料

16. Java如何指定多个线程的执行顺序? 


17. 简述一下Spring的Bean生命周期 
1.实例化->Instantiation2.属性赋值->Populate3.初始化->Initialization4.销毁->Destruction实例化 -> 属性赋值 -> 初始化 -> 销毁


18. 微服务架构中使用统一配置中心有什么优缺点?列举一下你所了解的相关产品 

19. SQL优化的一般步骤,(追问SQL索引失效的一些情况) 


20. 现有一个需要关联7张表的复杂查询,该如何优化? 


21. 简述一下Spring Boot配置的加载顺序 



22. 现有Spring Boot 1.X的微服务需要迁移到2.X,需要注意哪些方面的坑? 


23. 微服务架构如何保证安全性 

24. mvn install和mvn package的区别 



25. spring boot启动做的事情 


26. spring cloud starter是通过什么机制实现的 


27排查线上问题的过程 



28技术选型和比较 


29ddd和解耦 

30常用设计模式,设计模式思想和在项目中的使用 


31各种中间件原理和核心源代码 


32线程安全 


33 gc过程及gc算法 


34线程池的使用&解决线程安全问题的办法及原理 

35 Spring事务的原理,失效场景 Spring事务的原理,失效场景?为什么会失效 


36 多线程CPU处理方式 



37 现场说一个场景,让设计架构和表,如何应对高并发 


38 架构规划,为什么这样设计,扩展性,安全性等如何,具体体现在哪里

  加端端老师免费领取更多编程资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值