问题总结

218 阅读3分钟

JVM

  • jvm内存结构
  • int i=1;i和1分别存储在哪个区域
  • 了解垃圾回收器吗?CMS,G1,G1是用于年轻代还是老年代

多线程

  • 了解synchronized关键字吗,如何使用,对象锁,类锁
  • volatile关键字,怎么保证可见性的
  • java内存模型,线程内存,主内存
  • 除了synchronized和lock,怎么保证线程的安全性
  • 如何唤醒sleep的线程

Spring

  • SpringMVC执行流程

    • 浏览器发送请求,WEB 容器将该请求转交给 DispatcherServlet 处理
    • DispatcherServlet 调用处理器映射器HandlerMapping,其根据用户的url请求查找匹配该url的Handler,即返回一个执行链HandlerExecutionChain(包括处理器和处理器拦截器)。
    • DispatcherServlet再请求处理器适配器HandlerAdapter调用相应的Handler处理请求,返回 ModelAndView给DispatcherServlet
    • DispatcherServlet将ModelAndView传给视图解析器ViewReslover解析,返回具体View
    • DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
    • DispatcherServlet将页面响应给用户

    springmvc提供了不同的映射器HandlerMapping,实现不同的映射方式如:配置文件方式,实现接口方式,注解方式等。 springmvc通过HandlerAdapter使处理器解耦,处理(Handler不仅局限于控制器Controller这一种形式。目前Spring可以支持Servlet、HttpRequestHandler、ThrowawayController、Controller。 DispatcherServlet源码解读:zhuanlan.zhihu.com/p/22286839

设计模式

  • 设计模式,spring的controller是哪种设计模式
    • 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
    • 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
    • 代理设计模式 : Spring AOP 功能的实现。
    • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
    • 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
    • 装饰者设计模式
      • 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
      • JDK 中就有很多地方用到了装饰者模式,比如 InputStream家族,InputStream 类下有 FileInputStream (读取文件)、BufferedInputStream (增加缓存,使读取文件速度大大提升)等子类都在不修改InputStream 代码的情况下扩展了它的功能。
    • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。 参考https://www.cnblogs.com/kyoner/p/10949246.html

HashMap

  • HashMap的底层结构:数组+链表
  • HashMap、ConcurrentHashMap、HashTable对key、value为null的处理
    • HashMap:key为null时,调用putForNullKey方法处理,默认其hashCode为0,存储在table[0]位置。
    • ConcurrentHashMap:value为null,校验时直接抛空指针,key为null,运行key.hashCode()时,会报空指针异常。
    • HashTable:value为null,校验时直接抛空指针,key为null,运行key.hashCode()时,会报空指针异常。

redis

  • redis是单线程还是多线程的? redis基于内存的采用单进程单线程模型的KV数据库,由C语言实现,可以达到100000+的QPS(每秒内查询次数,连接数较少时)。为什么这么快?
    • 完全基于内存
    • 数据结构简单,操作简单
    • 单线程,不需要切换上下文,无竞争
    • 多路I/O复用:多个网络连接复用一个线程
  • 为什么设计为单线程? 单线程已经很快了,单线程实现简单,但单线程无法发挥多核CPU的优势,可以通过单机多实例完善。 参考https://zhuanlan.zhihu.com/p/42272979

项目

  • 上线项目的用户量
  • 如何部署,有几台机器虚拟机,线程部署的机器,配置是怎么样的