面试题day28

  • 一面

    • 自我介绍,简单介绍了一下之前做过什么项目,用了什么技术等等,没有详细问项目的细节,但具体的功能和业务一定要讲清楚。

    • JVM垃圾回收,fullgc是否可以回收方法区

      GC 的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

      • 对新生代的对象的收集称为minor GC
      • 对老年代的对象的收集称为Full GC

      可以

    • redis支持的数据类型到跳跃表,redis同步策略

      • string 缓存 session共享 分布式锁
      • list 消息队列
      • hash 存储对象
      • set 集合
      • zset 排行榜

      主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。

      全量同步

      Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。

      增量同步

      Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

    • 如何自己实现lru

      zset

    • mysql索引的数据结构,为什么用B+树不用B树

      遍历层级短、io效率高

    • 事务隔离级别,聚集锁非聚集锁

      ru rc rr s

      脏读 不可重复读 幻读

      数据和索引是否存储在一起

    • 如何用可重复读的隔离级别避免幻读

      next-key lock

    • 线程池的构造函数参数,队列的拒绝策略

      核心线程数、阻塞队列、最大线程数、存活时间、时间单位、线程工厂、拒绝策略

      直接返回调用、最早抛弃、直接抛弃、抛异常

    • spring相关、bean的生命周期,循环引用问题spring如何处理

      • 推断构造方法
      • 依赖注入
      • Aware接口设置依赖
      • 初始化前
      • 初始化
      • 初始化后

      单例setter注入

      • 解决过程

        • 创建对象A,实例化的时候把A对象工厂放入三级缓存
        • A注入属性时,发现依赖B,转而去实例化B
        • 创建对象B,实例化的时候把A对象工厂放入三级缓存;注入属性时发现依赖A,一次从一级到三级缓存查询A,从三级缓存通过对象工厂拿到A,把A放入二级缓存,同时删除三级缓存中的A,此时,B已经实例化并且初始化完成,把B放入一级缓存。
        • 接着继续创建A,顺利从一级缓存拿到实例化并且初始化完成的B对象,A对象创建也完成,删除二级缓存中的A,同时把A放入一级缓存。
        • 最后,一级缓存中保存着实例化,初始化都完成的A,B对象
    • concurrentHashmap1.8为什么放弃了分段锁

      锁的粒度不断变大

      snchronized已经优化为轻量级锁

    • 数据库分库分表相关

      垂直分表:可以把一个宽表的字段按照访问频率、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提高部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失。

      垂直分库:可以把多个表按照业务的耦合性来进行分类,分别存放在不同的数据库中,这些库可以分布在不同的服务器,从而使访问压力被分摊在多个服务器,大大提高性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。

      水平分库:可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同的服务器,从而使访问压力被多服务器负载,提升性能。它不仅需要解决跨库带来的问题,还需要解决数据路由的问题。

      水平分表:可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表的数据只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。

    二面

    • springAOP的原理,动态代理是怎么实现的

      Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。常用于计算接口运算时间、记录日志。

      AspectJ AOP 基于字节码操作的AOP。

    • fullgc的时候会导致接口的响应速度特别慢,如何排查和解决

      jconsle

      jstack

    • netty,如何避免的NIO空循环,零拷贝

    • 问了一些简单的算法,说一下思路

    • kafka的replicas的作用,为什么比其他的消息队列好。

    • 微博评论长链接短链接的问题,让我设计一个服务来处理长链接短链接,包括怎么读怎么存等。

    • 各种聊项目,从项目的架构设计到部署流程。

    • solr和mongodb的区别,存数据为什么不用solr?

    • 谈谈分布式锁、以及分布式全局唯一ID的实现比较?

      Redis Zookeeper 数据库

      数据库自增ID 数据库集群 数据库号段模式 Redis MongoDB UUID Snowflake UidGenerator Leaf

    • 对分布式架构设计的哪些方面比较熟悉?

    • 介绍你实践过的性能优化案例,以及优化思路

    • 你参加过的项目中,哪个项目让你收获最多,这个项目使用了哪些技术,挑战在哪里?

    • 三面面试官特别关注项目的实现和细节。为什么分这几个模块,每个模块做什么以及为什么要用这些技术,都需要非常清楚地解释,中间如果他有疑问会立马打断来问问题。

posted @ 2022-08-18 15:21  Faetbwac  阅读(43)  评论(0编辑  收藏  举报