2020/06/16-阿里两年java岗位面试

近期虽然没有换工作的打算 但是也还是要出去面试几次 ,接受一下社会的毒打。
记录一下最近一次面试中没有当场回答上来的问题吧。部门是菜鸟。
1、了解过mysql索引吗?组合索引 ABC 中如果条件只有B C 能用上这个索引吗?A and C能用上索引么?A or C能用上索引么?组合索引为什么是最左原则?
答:深入理解为什么是最左原则需要了解mysql的存储结构,首先or会引起索引失效这个说法并不准确,需要在指定环境下才有讨论的必要性,以mysql10.1.24版本和mysql5.7版本为例,innodb引擎,5.7版本下假如or连接的俩个查询条件字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描,而mysql10.1.24版本两个查询条件列均为索引的情况下,也会使用全表扫描。
组合索引,当创建(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)联合索引以及(a,b,c)联合索引,想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用到!针对各个数据库各个版本各种引擎都可能存在不一样的说法!自己平时是到已有的sit环境数据库进行测试

2、你觉得自己工作两年内的技术沉淀有哪些?
3、多线程都哪些线程同步的方法?你说的这几种方法中哪个性能更好一点呢?
答:synchronized: 实现机理依赖于软件层面上的JVM,其性能会随着java版本的不断升级而提高,由于其可靠性高,实现方便等原因,日常工作中线程同步问题推荐使用这个 。 ReentrantLock:可重入锁,继承自lock接口并实现了其方法,JDK5之前在并发量小情况下与synchronized性能相差无几,在高并发量的情况下,synchronized性能会急速下降,而ReentrantLock可以维持在同样的水准,但是在JDK6之后对synchronized进行了一系列锁优化措施,在相同测试环境中两者性能基本可以持平。
其中JDK6之后引入的锁优化措施:适应性自旋锁、锁消除、锁膨胀、轻量级锁、偏向锁等。
AtomicInteger:原子同步类,JVM特意封装的一些同步类,性能高,方便使用
Semaphore:信号量,信号量主要用来完成多个临界资源的访问

4、InnoDB存储引擎支持表锁还是行锁?
答:InnoDB支持表锁和行锁,
以上是除了项目介绍之外 我当场没有回答上来的问题,面试时太过紧张 ,之后复盘一下其实也都是基础题。全程面试官很友好 只怪自己太菜。
还有一点印象比较深刻的是,这里面很多知识自己只是知其然,没有主动去思考所以然,加油吧 少年

##########################################################

是的,同志们,我又去面阿里了。
整体面试体验良好,面试官超级友好,而且在尽力提示我。。。恨自己为啥这么菜鸡
1、自我介绍+项目介绍
2、spring的两大特性包括IOC和AOP,那么为什么要有IOC ?AOP平时用过吗?知道AOP是通过哪项技术实现的吗?答出动态代理之后,知道动态代理有哪几种方式吗?
答:为什么要使用IOC:IOC即Inversion Of Control 控制反转。具体的来说,当某个java实例(调用者)需要另外一个java实例(被调用者)的协助时,在传统的程序设计过程中,通常由调用者创建被调用者的实例,但在Spring中创建被调用者实例的过程交由Spring容器完成,注入调用者,即控制反转或者说是依赖注入。这样程序开发人员不需要频繁的创建对象,降低bean之间的耦合,天然的给程序开发提供了单例,并能让程序开发人员专注于业务代码的编写

AOP平时由用过么:笔者在面试之前确实没有实战过AOP,不过说来也巧,最近的一个项目重构中确实用到了aop,在项目gateway层调用service返回之后,要设置session的值传给前端,由于接口比较多,需要设置session的地方也就太多,刚开始想着抽离方法,代码复用,但是发现即使写了每个接口返回也都要去调用一下,依旧是强耦合。因此就想到了aop。将切点设置在了方法所在的类,针对类中方法返回的值做了标记以此判定要设置到session中的值

AOP通过哪项技术实现的:动态代理

动态代理有哪几种方式:jdk动态代理和CGLIB动态代理。spring中如果被代理类实现了接口,则默认情况下会采用CGLIB动态代理,当然也可以通过配置强制使用jdk动态代理。如果没有实现接口则必须使用CGLIB,spring会自动在两者之间进行切换

#设置代理模式 true(cglib) false(java JDK代理)
spring.aop.proxy-target-class=true

扩展:jdk动态代理和CGLIB动态代理的区别:
a. jdk动态代理是基于反射机制的,生成一个实现代理接口的匿名类,重写方法,实现方法的增强,而CGLIB基于继承机制,继承被代理类,底层利用asm开源包,将代理对象类的class文件加载进来,通过修改其字节码,生成子类覆盖其原有方法处理
b.jdk动态代理只能针对实现了接口的类进行代理,不能针对类,而CGLIB可以。但是因为CGLIB是继承所以不能对被final修饰的类产生代理。
c.jdk生成类很快,后续调用类操作会比较慢,cglib生成类的操作慢,但后续执行类的操作的时候会很快。

3、平时工作中用什么监控系统?答出cat后,知道cat为什么能够实现监控吗?
4、平时项目中怎么和其他系统交互的?答出rpc方式后,知道rpc调用其他接口的过程中会涉及到哪些组件么?zk+代理
5、知道怎么看CPU使用率吗?怎样查看日志文件?
答:linux机器上使用top命令 ,只输入top的话,控制台动态显示cpu使用状态,输入top -bn 1 -i -c显示机器总的使用情况,如图所示哈哈哈哈
us:表示用户空间程序的cpu使用率
sy: 表示系统空间cpu的使用率,主要是内核程序
ni: 表示用户空间且通过nice调度过的程序的cpu使用率
id:空间cpu
另外还有vmstat 和sar用得比较少一些

到虚拟机查看日志文件的命令行有很多在没有接入日志工具的情况下,可以使用的linux命令很多:
less file
shift + g 更新最新日志,/关键字 回车可以查询 shift+n向前查询,n向后查询

6、问自己最近在看哪些书或者知识点?答深入理解java虚拟机,问简述一下GC的过程
7、发生full GC的原因有哪些?
答:1、System.gc()的调用,该方法是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发full GC
2、老年代空间不足。新生代对象转入及创建大对象、大数组时会出现空间不足的现象。

8、在工作中会用到多线程么?你觉得在工作中哪些场景适合用到多线程?
答:用到了多线程,由于是springboot项目,所以多线程用起来比较方便,直接使用ThreadPoolTaskExecutor配置了一个线程池的bean,在需要使用多线程的方法上面标注注解@async(bean名称),便实现了多线程,使用到的场景是需要连接smtp服务器发送邮件,由于这个连接过程较为耗时,便使用了多线程通过异步的方式进行操作
9、为什么要离职?
10、你有什么要问的吗?
整个面试下来 ,感觉到面试官想要的是平时工作中要保持好奇心的程序开发者,理论与实践相结合的开发,
道阻且长。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值