JAVA高级面试总结

前言:本人一共面试三家,第一家不熟练,遇到了很多问题,第二家拿到了offer,第三家也基本过了,由于CTO没在,无法定级(定薪资),暂时没有发offer。由于只有三家面试经验,再加上本人语文水平不是很好,技术也不是很6,难免会有错误,欢迎指正,本文作为面试参考

首先自我介绍,可以简单说下自己信息,例如:我叫XXX,来自XXX,今年XXX,爱好:XXX,工作经验:XXX(这些可以不用都一起回答)
目前所负责的项目的是微服务分布式电商项目(也可以其它,微服务分布式要体现),主要用到了以下技术:
1.我们的商品搜索用的是es(面试官如果打断,可以跟他说下用es的原因,为什么不用数据库,讲下倒排索引(lucene),es如何和数据库同步的(logstash与mq的两种对比),logstash实现细节也可以说下(如果面试官感兴趣)如果装下B,可以讲下目前市面有两种流行的搜索引擎,例如solr,es,我们在技术选型的时候用的是es,扯一下es与solr的区别,突出es的优势,如果继续深入,可以讲下es持久化的机制(flush,merge,buffer,translog等等,默认5秒丢失数据等,自行百度))
注:括号的东西如果面试官不打断放到后面说。

2.缓存使用的是redis(redis使用了哪几中数据类型,结合项目去说,例如商品数据使用的hash存放对象。使用redis遇到了哪些问题?例如缓存雪崩,缓存穿透,解决方案。Redis单线程模型,为什么还这么快?Redis集群方案,主从复制原理,redis分布式锁如何使用的,具体使用到了那些地方,redis多台集群,使用分布式锁会有什么问题?再扯下zookeeper分布式锁的区别,哪种方案好?redis与数据库数据不一致,怎么解决?Redis中存放了10g数据,其中4g到期了,会立刻删除吗,你来谈下redis数据过期移除策略(定期+惰性),如果内存不够用了怎么办,最后再说下淘汰策略LRU)

3.因为我们这个项目是分布式的,日志收集使用的是ELK+kafka(讲下为啥使用ELK,为什么用kafka)

4.我们项目中使用了rabbitMq和kafka消息中间件(rabbitmq集群原理(有两种,说镜像集群模式),持久化原理(1.创建queue的时候设置持久化,2.消息持久化(deliveryMode设置为2)),kafka集群原理?生产者如何不丢消息?(rabbitmq自带事务+confirm模式都说下)?消费者如何不丢消息,重复消费怎么办?你在项目中哪些地方用到了mq,rabbitmq 5种模式和4中交换机来谈下等?如果让你设计一个消息中间件你会怎么设计?参考kafka)

还使用到了分布式配置中心:apollo(有没有其它替换方案:springcloudconfig等)分布式任务调度:xxl-job,分表分库中间件:mycat与sharding-Jdbc的区别

主要开场白先介绍下项目的大体情况,括号的技术点可以后面一步一步说,然后继续我负责的项目是支付模块(结合自己的项目来),我给您简单介绍下支付的流程:xxxx,第三方支付提交方式:html表单,提交后会有前台通知,后台通知(描述下具体),我们在开发中遇到了一些难题,比如网络延迟情况下,没有及时反馈状态码给第三方支付平台,第三方支付平台会不断的重试,涉及到订单状态不一致,如何解决?支付金额不一致如何解决?系统挂了,没收到第三方支付平台通知如何解决?对账怎么实现的?再谈下分布式事务(和第三方支付系统用最终一致性),支付服务和积分服务分布式一致性解决方案?(直接开扯分布式事务其实有好多中解决方案,但是底层原理是相似的,都是基于最终一致性,扯下CAP,BASE,2PC,简单描述下这三个,目前市面上解决方案有TCC,LCN,ebay的本地事务表,知道的话简单表述下这几个)我负责这个项目是使用的rabbitmq基于最终一致性解决的,直接说三点实现思路即可。讲到mq异步调积分接口时,说下多线程。

再说下项目中哪些地方使用到了设计模式?策略模式、模板方法,工厂,责任链,单例(谈到单例可以秀一波操作,单例创建方式:例如内部类,但是有的人就是喜欢装B,我用反射去获取单例,结果会破坏单例,这是为什么?序列化也会破坏,为什么?哪有没有比较好的解决方式:当然用枚举:从JDK层面就为枚举不被序列化和反射来保驾护航)

秒杀的解决方案?最大难点就是高并发
前端如何做的?后端如何做的?如何防止超卖?令牌桶限流,redis分布式锁干了啥,服务降级,隔离,保护等等

说到多线程,讲下线程的创建方式,项目中是怎么使用多线程的,例如jdk自带四种线程池实现方式,线程池的好处也可以说下,说下线程池的核心参数,再说下但是我们项目中没有使用Exceutors去创建(为什么不使用?根据阿里巴巴开发手册)
在这里插入图片描述
然后扯一下线程池源码最好(7个参数,4个拒绝策略等等),我们项目中是架构师定义的线程池。。。

这时候在跟面试官聊聊并发编程的一些知识,例如ArrayList线程不安全,有什么替代方案?
(vector,Collections.synchronizedList,CopyOnWriteArrayList)ArrayList数据结构,默认扩容方案,三种替代方案优缺点,CopyOnWriteArrayList为什么add进行了加锁,get不加锁(共享变量加了volatile关键字,get加锁后,根据JMM内存模型happensbefore原则,加了volatile关键字后写先于读,想再深入点讲讲happensbefore规则)注:CopyOnWriteArrayList性能最好,但是比较耗内存,说下原因

hashMap hash发生碰撞后,在链表中如何存放的,hashMap线程不安全替代方案:hashTable和concurrentHashMap,讲下这两者区别,concurrentHashMap可以聊下分段锁(Segment等,为什么put加锁,get不加锁,参考上面CopyOnWriteArrayList)

在谈下原子类CAS(底层自选锁和unsafe类)例如AtomicInteger,使用场景,CAS锁的ABA问题说下,如何解决

synchronized与lock的区别(synchronized在编译层用了monitorenter,monitorexit),再谈下读写锁等等,如果想装下B,说下线程池的提交方式execute(不带返回值),submit(带返回值),扯一个应用常见,多线程要有返回值怎么办?用Callable接口 ,但是Callable需要futureTask把它与线程池联系起来,用future.get()得到返回值,这个方法是同步的吗?在深入点用fork/join解释下一个任务拆分成多个子任务(如果你确实想装B深点)如何合起来?

如果面试官想问你jvm,不要怂,直接说在项目中遇到了哪些异常信息:例如
在这里插入图片描述

扯几个就行,谈下如何标记为垃圾的(GCRoot),四种算法,四种垃圾回收器:串行,并行,CMS,G1,这几种的对比,调优常用的参数,互联网公司为什么使用CMS(其实是CMS+SerialOld(备胎))CMS四个步骤描述下?Springboot项目打成jar包如何配置参数?

还有很多,比如api接口如何设计的(Oauth2.0协议,权限等等),还有springIOC,mvc,AOP,数据库的优化,如何设计一个高并发系统(例如积分兑换系统)等等,聊的越多越好,还有一些没列出来,欢迎大家补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值