本期是【大厂面试】系列文章,模拟阿里面试题目。
面试开始
面试官:看你简历写了熟悉Java基础,讲讲Object常用方法有哪些?
独白:so easy~
大彬:Object常用方法有:toString()
、equals()
、hashCode()
、clone()
、getClass()
等。
大彬:toString()方法默认输出对象地址。可以重写toString方法,按照重写逻辑输出对象值
大彬:equals()方法默认比较两个引用变量是否指向同一个对象(内存地址)。
大彬:hashCode()方法将与对象相关的信息映射成一个哈希值,默认的实现hashCode值是根据内存地址换算出来。
大彬:clone()方法可以实现对对象中各个属性的复制。
大彬:getClass()返回此Object的运行时类,常用于Java反射机制。
面试官:嗯,什么是反射呢?大彬:动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
大彬:在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法
大彬:对于任意一个对象,能够调用它的任意一个方法和属性
大彬:这就是Java的反射机制
面试官:那反射有哪些应用场景呢?
大彬:1. JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序
大彬:2. 很多开发工具如Eclispe、IDEA等利用反射动态解析对象的类型与结构,动态提示对象的属性和方法
大彬:3. Web服务器中利用反射调用了Sevlet的service方法
大彬:4. Spring AOP的特性也是依赖反射实现的
面试:来讲讲什么是GC?为什么要GC?
大彬:GC(Garbage Collection
),垃圾回收,是Java与C++的主要区别之一
大彬:作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码
大彬:这是因为在Java虚拟机中,存在自动内存管理和垃圾清理机制
大彬:对JVM中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,保证JVM中的内存空间,防止出现内存泄露和溢出问题
面试官:嗯,平时工作可能遇到OOM的问题,知道怎么排查吗?
旁白:线上JVM必须配置-XX:+HeapDumpOnOutOfMemoryError
和-XX:HeapDumpPath=/tmp/heapdump.hprof
,当OOM发生时自动 dump 堆内存信息到指定目录
大彬:排查 OOM 的方法如下:
大彬:查看服务器运行日志日志,捕捉到内存溢出异常
大彬:使用jstat查看监控JVM的内存和GC情况,评估问题大概出在什么区域
大彬:使用MAT工具载入dump文件,分析大对象的占用情况
面试官:知道哨兵Sentinel吗?
大彬:哨兵模式是一种特殊的模式。哨兵是一个独立的进程,可以独立运行。
大彬:其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。大彬:客户端连接Redis的时候,先连接哨兵,哨兵会告诉客户端Redis主节点的地址,然后客户端连接上Redis并进行后续的操作。
大彬:当主节点宕机的时候,哨兵监测到主节点宕机,会重新推选出某个表现良好的从节点成为新的主节点,然后通过发布订阅模式通知其他的从服务器,让它们切换主机。
面试官:哨兵的工作原理,详细讲讲?
旁白:我晕
大彬:原理如下:
大彬:每个Sentinel
以每秒钟一次的频率向它所知道的Master
,Slave
以及其他 Sentinel
实例发送一个 PING
命令。
大彬:如果一个实例距离最后一次有效回复 PING
命令的时间超过指定值, 则这个实例会被 Sentine
标记为主观下线。
大彬:如果一个Master
被标记为主观下线,则正在监视这个Master
的所有 Sentinel
要以每秒一次的频率确认Master
是否真正进入主观下线状态。
大彬:当有足够数量的 Sentinel
(大于等于配置文件指定值)在指定的时间范围内确认Master
的确进入了主观下线状态, 则Master
会被标记为客观下线 。若没有足够数量的 Sentinel
同意 Master
已经下线, Master
的客观下线状态就会被解除。
大彬:哨兵节点会选举出哨兵 leader,负责故障转移的工作。
大彬:哨兵leader会推选出某个表现良好的从节点成为新的主节点,然后通知其他从节点更新主节点信息。
面试官:不错,明天来上班吧
旁白:不会坑我吧...