盒马鲜生20200316

1. 问题

  1. 说一下印象深刻的项目,你再里面是什么角色,你是怎么做的

  2. app后台是管理提出来,还是有产品提出的

  3. 你是怎么实现的?是做个配置前端做个解析这样就完了吗?

  4. 你能给我讲下你要处理哪些东西

  5. 你有用过线程池吧,线程池的执行流程,他在使用过程如何发挥作用的

  6. ThreadLocal 你有使用吗?你是怎么用的?

  7. ThreadLocal里面具体是怎么实现的?

  8. ThreadLocal不remove 掉会导致什么问题?

  9. 线上你有遇到FullGC吗?说一下FullGC产生的一个过程

  10. FullGC你再线上遇到问题你应该怎么排查?

  11. 你了解Jstack 如何把线程里面的东西拿出来?

  12. 你了解过java中有agent(探针),你了解过吗?

  13. 你了解过一个探针怎么把服务给拉下来的?

  14. JVM中有一个叫双亲委派机制,你有了解吗?

  15. 你有了解说有哪些框架不遵循双亲委派机制?

  16. 你知道tomcat 是如何破坏的吗?

  17. springbean 的作用域有了解吗?他的默认作用域是什么?

  18. single 和propeType 的区别,你能跟我讲一下吗?

  19. 我该什么时候用single,什么时候用propeType

  20. springbean 是单例的,他会有线程安全问题,多线程访问你这个单例对象

  21. mysql 的sql调优你有做过吗?

  22. mysql有复核索引也叫联合索引,有用过吗?

  23. 假如现在我有这样一个查询条件,我看下你应该怎么建联合索引

    where a=1 and b=2 and c>3 and b=4,我对这四个进行联合索引我该怎么建

  24. mysql 数据库有个事务的隔离级别,默认有什么隔离级别

  25. 能讲一下readcommit会导致什么问题呢?

  26. 你对设计模式有了解吗?

  27. 你近期有在看什么技术文档或开源项目吗?

  28. 介绍一下这个开源项目是干嘛的?

  29. 你自己写的那个服务,你有做一些稳定性的措施,保证性的措施吗?比如别人调用你的服务,调用量很大,对你的性能产生了比较大的影响,做一些保护。如何保证不会影响到你的服务

  30. 你是怎么做降级的?

  31. 两年一换,你为什么离职

  32. 如何利用业余时间学习新技术?

2. 精选回答

  1. 线程池的执行流程,构造器参数,他在使用过程如何发挥作用的

    1. 当前池中的线程比核心数少,新建一个线程执行任务
    2. 核心池已满,但任务队列未满,添加到队列中
    3. 核心池已满,队列已满,试着创建一个新线程

    构造器参数的作用

    • 第一个参数corePoolSize 核心线程数,

      1. 在线程数少于核心线程数,有新任务进来就新建一个线程。
      2. 等超出核心数量后,就不会新建线程,空闲线程就得去任务队列里去任务执行
    • maximumPoolSize:最大线程数据

      • 包含核心线程池数量+核心以为的数量
      • 如果任务队列满了,并且池中线程数小于最大线程数,会再创建新的线程执行任务
    • keepAliveTime:核心池以外的线程存活时间,即没有任务的外包的存活时间
      • 如果给线程池设置 allowCoreThreadTimeOut(true),则核心线程在空闲时头上也会响起死亡的倒计时
      • 如果任务是多而容易执行的,可以调大这个参数,那样线程就可以在存活的时间里有更大可能接受新任务
    • workQueue:保存待执行任务的阻塞队列
    • threadFactory:每个线程创建的地方
    • handler:饱和策略,大家都很忙,咋办呢,有四种策略
  2. ThreadLocal 你有使用吗?你是怎么用的?

    ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。

    所以ThreadLocal主要用来实现变量在线程间隔离的场景,如

    • 用来存储用户的session
    • 还有像线程内的上下文管理器、数据库连接等
  3. ThreadLocal里面具体是怎么实现的?

    1. 每个Thread 维护这一个ThreadLocalMap的引用
    2. ThreadLocalMap 是 ThreadLocal的内部类,用Entry来进行存储
    3. 调用ThreadLocal的Set()方法时,实际上就是往ThreadLocalMap设置值,key是ThreadLocal对象,值是传递进来的对象
    4. 调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象
    5. ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value
  4. ThreadLocal不remove 掉会导致什么问题?

    不remove掉,就会导致内存泄漏问题

    因为:ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应的key就会导致内存泄漏

  5. 线上你有遇到FullGC吗?说一下FullGC产生的一个过程

    随着程序的运行,对象不断创建,肯定会遇到FullGC

    1. 堆可以分成新生代和老年代,FullGC发生在老年代
    2. 对象优先在Eden区分配内存
    3. 大对象和长期存活的对象进入老年代
    4. 当老年代的空间不足时,就产生了FullGC
  6. FullGC你再线上遇到问题你应该怎么排查?

    1. 使用 jstat -gcutil 命令监控当前系统GC状况
    2. 通过jmap dump:format=b,file=导出系统当前的内存数据
    3. 通过mat工具分析得出内存中主要什么对象消耗内存,进而可以处理相关代码
  7. 你了解Jstack 如何把线程里面的东西拿出来?

    1. jstack等命令会与jvm进程建立socket连接
    2. 发送对应的指令(jstack发送了threaddump执行)
    3. 然后再读取返回的数据
  8. 你了解过java中有agent(探针),你了解过吗?探针怎么把服务给拉下来的?

    Agent是一个运行在目标JVM的特定程序,他的职责就是从目标JVM中获取数据,然后将数据传递给外部进程。


    他主要通过一个java虚拟机对外提供的native编程接口 JVMTI 。获取运行时的JVM信息,比如线程,GC等

  9. JVM中有一个叫双亲委派机制,你有了解吗?

    类加载的时候

    1. 首先判断类是否被加载过,已经加载直接返回
    2. 加载
      1. 首先会把请求委派到父类加载器的loacClass处理,所以请求最终都会到BootstrapClassLoader
      2. 当父类无法处理时自己处理
  10. 你有了解说有哪些框架不遵循双亲委派机制?

    Tomcat 不遵循

    一个tomcat web容器可能需要部署两个应用,不同应用可能依赖同一个第三方依赖的不同版本。

    tomcat 通过破坏双亲委派机制达到了这个效果

  11. 你知道tomcat 是如何破坏的吗?

    Tomcat 自定义了好几个类加载器,其中WebappClassLoader 是私有的类加载器,加载路径中的class只对当前webapp可见

  12. springbean 的作用域有了解吗?他的默认作用域是什么?

    作用域主要有 singleton、prototype、request、session。

    默认都是单例的

  13. Singleton 和propeType 的区别,你能跟我讲一下吗?

    • Singleton 是唯一bean实例,单例
    • prototype:每次请求都会创建一个新的bean实例
  14. 我该什么时候用single,什么时候用propeType

    主要依据这个bean 有无状态会话来决定

    无状态会话,选择singleton

    有状态会话,选择prototype,有状态配置singleton 会出现线程安全问题

  15. springbean 是单例的,他会有线程安全问题,多线程访问你这个单例对象,你是怎么处理的

    在勒种定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中

  16. mysql 的sql调优你有做过吗?

    结合实际场景,从以下几个方面说

    • 设计表时:合适的索引、合适的数据类型、非空,单表字段不超过20
    • 编写sql时:禁止一切会影响sql速度的语句
    • 分表:水平拆分和垂直拆分
    • 分库:读写分离
  17. mysql有复核索引也叫联合索引,有用过吗?

    两个或两个列以上的索引被称为联合索引,mysql可以从左到右使用索引中字段,一个查询可以只使用索引中的一部分,但只能是最左部分(最左前缀)

    例如索引 key index(a,b,c) 可以支持a|a,b|a,b,c,三种组合查找,但不支持b,c 进行查找

  18. 假如现在我有这样一个查询条件,我看下你应该怎么建联合索引

    where a=1 and b=2 and c>3 and b=4,我对这四个进行联合索引我该怎么建

    > 后面不会再用索引,所以要把c>3 放在最后,然后索引用abdc

    如果使用key index(a,b,c,d),且不改变顺序,那么只会使用到abc

  19. mysql 数据库有个事务的隔离级别,默认有什么隔离级别

    事务的隔离级别:

    • READ-UNCOMMITED
    • READ-COMMITED
    • REPEATABLE-READ
    • SERIALIZABLE

    Mysql 默认是 REPEATABLE-READ

  20. 能讲一下 READ-COMMITED 会导致什么问题呢?

    隔离级别使用READ-COMMITED 后,不会出现脏读,但是还是可能出现不可重复读和幻读

  21. 你对设计模式有了解吗?

    之前写过一个SDK 提供给其他公司使用

    主要用到的设计模式

    • Builder建造者模式:将对象构造通过建造者模式来配置,达到解耦和易于扩展的目的

    • 门面(外观)模式:通过创建一个统一的门面入口,包装子系统中多个类,客户端通过调用外观类的方法来调用内部子系统所有方法

    • 观察者模式:当一个用户状态等发生变化时,则会自动通知他的依赖对象

results matching ""

    No results matching ""