阿里外包电话面试题
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
- 新生代最小值
- xms
- 堆内存分配策略
- 对象优先在Eden 区分配
- 当 Eden 区没有足够空间分配时,虚拟机将发起一次 Minor GC。
- 大对象直接进入老年代
- 最典型的大对象是那种很长的字符串以及数组。
- 目的:1.避免大量内存复制,2.避免提前进行垃圾回收。
- 参数PretenureSizeThreshold=3m,超过多少大小的对象直接进入老年代
- 长期存活对象进入老年代
- 对象在Eden出生后经历Minor GC后仍存活,且能被survivor容纳,将移动到survivor中,并设置对象年龄为1, 对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1,当它的年龄增加到一定程度(默认为 15)_时,就会被晋升到老年代中。
- 对象年龄动态判定
- 加单说就是,年龄大小满足条件就直接进老年代
- 空间分配担保
- 对象优先在Eden 区分配
- 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()/老年代区域空间不足/空间分配担保失败
- 空间分配担保
- 简单来说,就是看看有没有能装得下对象的空间
- Minor GC
- 自问一哈:内存分配比例?
- 堆分为
新生代1/3
和老年代2/3
- 新生代分为
Eden、Survivor(from)、Survivor(to)
,配比默认811
,可修改- 设置两个 Survivor 区是为了解决
碎片化
的问题(`复制回收算法)
- 设置两个 Survivor 区是为了解决
- 堆分为
- 如何判断对象可回收?
- 引用计数法
- 傻乎乎的,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。py在用
- 实现简单,但是麻烦在相互引用
- 可达性分析
- 这个算法的基本思路就是通过一系列的称为
“GC Roots”的对象作为起始点
,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain)
,当一个对象没有任何引用链相连时,则证明此对象是该回收的。
- 这个算法的基本思路就是通过一系列的称为
- 引用计数法
并发
- 说一下用过哪些线程安全的类
- ConcurrentHashMap
- 原理?
- 分段锁
- 为什么称为分段锁?
- 怎么分段的?
- 分段锁
- CAS
- 原理
- ABA
- 怎么解决的?
- 原理?
- ConcurrentHashMap
锁
- ReentrantLock内部机制
- AQS
- AQS内部原理展开聊一下
- AQS
- synchronized
- 原理
- 锁升级有了解过吗
多线程使用方式(应该是我理解错了,直接跳到线程池了,应该是想让我说实现多线程的方式,两种Runnable、Thread)
- 线程池
- 核心参数
- 有界队列与无界队列的区别
- 拒绝策略
- submit与execute的区别,哪个有返回值
- happen-before原则
Redis
- 为什么调用快?
- 单线程,采用IO多路复用
- 什么是IO多路复用
- 单线程,采用IO多路复用
- select,poll,epoll区别?
- 分区?
- 持久化方式?
- RDB和xx
- 分布式锁?
- setNx
- 有哪些数据结构,怎么用的
- 5种
Mysql
- 有哪些存储引擎
- 分别用了什么索引
- 原理结构是什么
- 分别用了什么索引
- 如何避免回表查询
- 索引失效原因
- 如何知道索引是否生效
- 查看执行计划
- type字段都有哪些值
- 分别代表什么意思
- type字段都有哪些值
- 查看执行计划
- mysql死锁有遇到过吗
- 有遇到过 table metadata lock
- show processlist
- 有遇到过 table metadata lock
必杀技:看过哪些技术书籍?(不是记得特别牢固的就别给自己挖坑了。。。说了半年内看过TCP协议,直接就是一顿打。。上来就是问:Tcp如何保证消息传输的可靠性?)
属于定级性面试,整体面了40分钟左右,还在等结果,不过估计是挂了。
后续整理,欢迎关注。
1024快乐,继续加油 😃
三分热血值得你十二分努力。