不知不觉离上一次微众面试竟然快两个月了,其实内心的折腾期已经骤减甚至磨灭了,昨天突然收到一个电话临时通知晚上过去面试,虽然说知道这周可能有面试,但没想到会这么赶,有和那边协调了一下,奈何他们boss就昨天晚上才有档期,所以就这样匆匆地再一次来到了微众这边。相比上一次的新奇,这一次在8楼这边,硬生生地感受到了狠狠地加班。原本八点的面试,因为boss开会的原因,推到了8.20,然后这边7.40就到了的我,开始了漫长的等待,有点nervous的我等啊等,等到完全没情绪的那种,再加上手机没电了,要不是飘哥,今天还不知道咋回去。。。 大概8.30吧,开始了一段四十分钟的面试,boss仍然在开会。。。 不过相比上一次感觉这次好多了,每每面试官还没发问完,这边就有预感他要问啥。总体来说Java基础基本没提,全局围绕项目and穿插知识点。
1.自我介绍
主要按时间倒序介绍了三个项目,项目内容,难点,亮点等。
2.徒手画其中一个你最熟悉的系统架构
这部分聊得挺久,升华到了多台服务器之间分布式的通信问题等
3.mybatis用过不?传参的时候 # 和 $ 有何区别,哪个可以防注入,防注入的原理是啥
#:解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
$:仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
#使用的是PreparedStatement,会有类型转换,比较安全 简单的说就是#{}是经过预编译的,是安全的,$是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
4.JDBC有用过不?PrepareStatement和Statement有何区别
1)preparestatement是预编译,对于批量处理可以大大提高运行效率。
2)preparestatement对象开销比statement较大。
3)statement每次执行sql 语句,相关数据库都要对sql语句进行编译,而preparestatement则不需要。
4)执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。
5)在企业应用程序中更喜欢使用PreparedStatement对象是因为它还具有安全性。传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配
5.Mybatis通常会写一个dao接口,为啥接口未实现可以直接进行调用
Mybatis通过JDK的动态代理方式,在启动加载配置文件时,根据配置mapper的xml去生成Dao的实现。详情
6.Spring事务的实现方式,DB事务?test1方法上有注解@Transactional,test2方法无注解,现在在test1方法中引用test2,问2中的方法是否支持事务?
Spring事务实现方式:
(1)编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
(2)基于 TransactionProxyFactoryBean的声明式事务管理
(3)基于 @Transactional 的声明式事务管理
(4)基于Aspectj AOP配置事务
DB事务:
没有太懂意思,参考
问题:
1)不同类之间的方法调用,如类A的方法a()调用类B的方法b(),这种情况事务是正常起作用的。只要方法a()或b()配置了事务,运行中就会开启事务,产生代理。
2)同一类内方法调用,无论被调用的b()方法是否配置了事务,此事务在被调用时都将不生效。
7.数据库涉及到的数据量最大有多少?可以怎么去定位慢查询问题?
直接分析mysql慢查询日志 ,利用explain关键字可以模拟优化器执行SQL查询语句,来分析sql慢查询语句。
索引是否起作用;字段很多的表分解成多个表;增加中间表;大的查询分解为多个小查询;
8.JVM内存模型,垃圾回收,判断对象存活的方法?
堆内存,栈,方法区,程序计数器等。
堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配
方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);
栈又分为java虚拟机栈和本地方法栈主要用于方法的执行,存储对象的引用。
垃圾回收——“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。
判断对象是否存活一般有两种方式:
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。
9.未来职业规划
10.平时加班多不?一般业余时间do what ?
11.工作几年?啥时候毕业?
最后面试完了,说还要等他那边和boss反馈结果。。。