阿里外包电话面试题

Spring

  • 并发处理?
    • 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
  • 优缺点?
  • bean生命周期?
  • 常用注解?
  • 自动装载的方式?
    • 常规方式

      • 通过构造器(配置元信息:XML、Java 注解和 Java API )

      • 通过静态工厂方法(配置元信息:XML 和 Java API )

      • 通过 Bean 工厂方法(配置元信息:XML和 Java API )

      • 通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )

    • 特殊方式

      • 通过 ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和 Java API )

        • getObjectToExpose()

          • ServiceFactoryBean 返回第一个ServiceLoader,迭代器

          • ServiceListFactoryBean 返回所有ServiceLoader,list

          • ServiceLoaderFactoryBean 返回一个ServiceLoader

      • 通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)

      • 通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)

JVM

  • 启动参数?
    • xms
      • 堆的最小值
    • xmx
      • 堆的最大值
    • xmn
      • 新生代的大小
    • -XX:NewSize
      • 新生代最小值
    • -XX:MaxNewSize
      • 新生代最小值
  • 堆内存分配策略
    • 对象优先在Eden 区分配
      • 当 Eden 区没有足够空间分配时,虚拟机将发起一次 Minor GC。
    • 大对象直接进入老年代
      • 最典型的大对象是那种很长的字符串以及数组。
      • 目的:1.避免大量内存复制,2.避免提前进行垃圾回收。
      • 参数PretenureSizeThreshold=3m,超过多少大小的对象直接进入老年代
    • 长期存活对象进入老年代
      • 对象在Eden出生后经历Minor GC后仍存活,且能被survivor容纳,将移动到survivor中,并设置对象年龄为1, 对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1,当它的年龄增加到一定程度(默认为 15)_时,就会被晋升到老年代中。
    • 对象年龄动态判定
      • 加单说就是,年龄大小满足条件就直接进老年代
    • 空间分配担保
  • jvm中堆栈的区别(问的很细致了,因为从os层来讲,本质上都是内存)?
    • 栈是线程私有,先进后出结构,包括虚拟机栈,本地方法栈,程序计数器
      • (面试官:此处应有刨根问底。我:我挣扎一下。。)
      • 说一下三者分别是干啥用的?
        • 虚拟机栈(确定当前线程执行到了哪个方法,包括方法内的一些参数:包括局部变量表、操作数栈、动态链接、返回地址)
          • 执行java方法用的
          • 每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢
          • 方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。
          • tips:区分异常
            • 线程请求的栈深度大于虚拟机所允许的深度:StackOverflowError
            • JVM 动态扩展时无法申请到足够的内存时:OutOfMemoryError
        • 本地方法栈
          • 用来执行c++方法的(native方法)
          • native 方法调用 JNI 到了底层的 C/C++
          • 什么是JNI?
            • JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。
            • 允许Java代码和其他语言写的代码进行交互
            • 使用java与本地已编译的代码交互,通常会丧失平台可移植性。
            • 有时也可以接受,比如使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。
        • 程序计数器
          • 确定当前字节码(java)执行到哪一行,如果是native则为空
          • 唯一不会OOM的区域
  • 垃圾回收是回收的哪块内存?
    • 当时只回答了堆,现在再思考一下,应该是堆和栈,理由如下:new对象时对象在堆里,但是对象的引用还在栈里,所以,在堆中的对象被回收时,那栈的引用是不是也该回收掉?
    • 回收的方式(当时好像回答成了垃圾回收器?明明知道的。害😳)?
      • Minor GC
        • 新生代发生,较频繁,速度快
        • Eden 区空间不足/空间分配担保失败
      • Full GC
        • 主要在老年代(新生代也会有),较少,速度慢
        • 调用 System.gc()/老年代区域空间不足/空间分配担保失败
      • 空间分配担保
        • 简单来说,就是看看有没有能装得下对象的空间
    • 自问一哈:内存分配比例?
      • 堆分为新生代1/3老年代2/3
      • 新生代分为Eden、Survivor(from)、Survivor(to),配比默认811,可修改
        • 设置两个 Survivor 区是为了解决碎片化的问题(`复制回收算法)
    • 如何判断对象可回收?
      • 引用计数法
        • 傻乎乎的,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。py在用
        • 实现简单,但是麻烦在相互引用
      • 可达性分析
        • 这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为 引用链(Reference Chain),当一个对象没有任何引用链相连时,则证明此对象是该回收的。

并发

  • 说一下用过哪些线程安全的类
    • ConcurrentHashMap
      • 原理?
        • 分段锁
          • 为什么称为分段锁?
          • 怎么分段的?
      • CAS
        • 原理
        • ABA
          • 怎么解决的?

  • ReentrantLock内部机制
    • AQS
      • AQS内部原理展开聊一下
  • synchronized
    • 原理
    • 锁升级有了解过吗

多线程使用方式(应该是我理解错了,直接跳到线程池了,应该是想让我说实现多线程的方式,两种Runnable、Thread)

  • 线程池
    • 核心参数
    • 有界队列与无界队列的区别
    • 拒绝策略
    • submit与execute的区别,哪个有返回值
  • happen-before原则

Redis

  • 为什么调用快?
    • 单线程,采用IO多路复用
      • 什么是IO多路复用
  • select,poll,epoll区别?
  • 分区?
  • 持久化方式?
    • RDB和xx
  • 分布式锁?
    • setNx
  • 有哪些数据结构,怎么用的
    • 5种

Mysql

  • 有哪些存储引擎
    • 分别用了什么索引
      • 原理结构是什么
  • 如何避免回表查询
  • 索引失效原因
  • 如何知道索引是否生效
    • 查看执行计划
      • type字段都有哪些值
        • 分别代表什么意思
  • mysql死锁有遇到过吗
    • 有遇到过 table metadata lock
      • show processlist

必杀技:看过哪些技术书籍?(不是记得特别牢固的就别给自己挖坑了。。。说了半年内看过TCP协议,直接就是一顿打。。上来就是问:Tcp如何保证消息传输的可靠性?)

属于定级性面试,整体面了40分钟左右,还在等结果,不过估计是挂了。
后续整理,欢迎关注。
1024快乐,继续加油 😃

posted @ 2020-10-24 11:23  夜旦  阅读(1532)  评论(0编辑  收藏  举报