深圳来电科技有限公司社招Java工程师(一)
面试前的准备:
公司的岗位技术栈要求:(在公司的招聘简章中查询到的。。。。)
- 熟悉JVM,内存模型、类加载机制以及性能优化
- 主流开源框架springboot/dubbo/springcloudy/Mybatis
- MySQL数据库、SQL调优
- Redis/Mongodb等NoSQL
- 分布式开发经验,对消息服务、负载均衡、高可用等机制,容器化经验者
- 日常寒暄,约定成俗的相互认识介绍……
- Java虚拟机的内存模型------建议直接上草图和面试官聊……
- 谈谈虚拟机创建对象的过程------虚拟机获取到new指令后能否在常量池中定位到一个类的符号引用,并检测是否被加载和初始化,然后为新生对象分配空间并初始化,设置对象头……
- 虚拟机创建对象会出现并发问题吗?----------说实话国内作为业务为主的程序员实际不用关注虚拟机(产品)的并发问题,这是老外升级或发布产品该考虑的事。给对象A分配内存时指针还没来的及修改,对象B又使用该指针来分配内存,所以会出现并发问题,至于怎么规避……我不晓得。
- 内存溢出一般发生在哪个区?永久代会不会导致内存溢出?------Java堆溢出,创建对象回收不及时肯定会导致。本地方法栈溢出,线程请求的空间大于虚拟机能够提供的空间或者虚拟机扩展栈大于物理机空间。方法区JDK1.7逐渐取代了所谓的永久代之说……具体的也说不清楚了。。。
- 栈溢出一般抛出什么异常?jvm设置栈的大小,参数?--------线程请求的栈大于虚拟机允许的容量抛出StackOverflowError异常,虚拟机扩展栈时受制于物理机的限制会抛出OutOfMemoryError异常。-Xss虚拟机参数……
- JVM的垃圾回收机制-----个人认为从三点来回答:那些内存需要回收?什么时候回收?怎么回收?一般来说垃圾收集器关注的主要是堆中的对象生命周期的动态变化,首先判断该对象的存活与否,生命周期耗尽的对象给予回收……
- 用过哪些命令查看JVM的状态、堆栈信息?--------jps命令,jstat命令,jmap内存映像工具……
- Java的类加载机制?自定义类加载器的实现?------虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。每个类都需要由加载它的类加载器和该类本身一起确立在Java虚拟机的唯一性,类加载器都拥有一个独立的类名称空间。比较类的相等必须在同一个类加载器下比较才有意义……
- String/StringBuffer/Stringbuilder的区别,和对应场景------参考jdk源码相关阐述,String底层使用final修饰字符数组所以对象不可变。StringBuffer和StringBuilder继承自AbstractStringBuilder(字符数组没有被final修饰)所以对象可变的。场景上从安全的角度来阐述:String当作不可变常量,线程安全,适合操作少量数据。StringBuffer底层对方法加了同步锁所以线程安全,适合多线程操作字符串缓存区下的大量数据。StringBuilder适合单线程下操作大量数据。……
总结:上午基本是基础JVM和基础语法等……
- Redis支持的数据类型?---------String(基本的字符串)/Hash(键值对)/List(链表)/Set(集合)/zset(有序集合)……
- Redis的持久化,持久化方式,优缺点?-----说白了就是内存数据落地到磁盘上,两种方式RDB(内存数据通过rdbSave函数生成RDB文件,一旦服务宕机内存丢失,重启后可以从磁盘的RDB文件中rdbLoad加载恢复数据)和AOF(通过flushAppendOnlyFile函数定时将缓存写入到AOF文件并保存到磁盘)。优缺点,无非是性能和安全……
- Redis的通讯协议?--------RESP为客户端和服务端的通讯协议……
- Redis的架构模式,以及各自的特点-------单机版(空间有限,无法高可用,一旦宕机就完了),主从复制(masterf负责写,slave负责读,多个slave实时复制一个master数据到自己的节点)……
- 你说的那个主从复制还有别的别的瓶颈问题吗?----------突然觉得自己是挖坑了,懵懂了……面试官又点拨了下写一台master,master也会有压力呀。原来是master高可用压力崩溃宕机的问题,哨兵机制监控主从redis,进行故障转移……。
- redis-cluster集群的相关--------主要是高可用,可扩展,但给人一种乱的感觉,各个节点互联,没有中心架构的特点……。
- Redis分布式锁的实现------------------
- Redis异步队列,怎么用?-------
- 缓存穿透?缓存雪崩?以及避免措施------缓存穿透,就是由于Redis内存数据库的数据来源于关系型数据库(例如Mysql),为了提高效率查询数据时先经过内存数据库,如果没有在去查mysql,但是对于一些恶意的请求频繁查询不存在的数据,则内存数据库如同虚设,所有的压力都跑到了mysql。避免措施,通过对请求的过滤,把不存在的数据放到Bitmap来应对,或者对请求不存在的数据也可以短时间设置到缓存中。缓存雪崩,就是缓存服务器宕机失效,请求压力又转移到了Mysql,设置不同过期时间的key,让缓存失效的时间点尽量均匀。
- 谈一下MySQL常见的两种存储引擎,适用场景------MyISAM和InnoDB的对比,MyISAM有meta-data统计行数(count *)不需要消耗多少资源。但InnoDB支持事务(提交、回滚)崩溃修复的安全机制。……性能上MyISAM更快,安全上InnoDB更安全,所以主从分离的情况下还需要给予实际业务的并发场景……
- 谈谈你对数据库索引的理解--------将无序数据整合成有序数据,保证查找的效率更快和维护的唯一性;mysql主要用到的索引有哈希索引和BTree索引……具体再阐述下内容。。。
- 如何保证缓存和数据库双写的一致性-----------------结合自己的工作经验公司项目中的处理措施,比如监听数据库变更,然后更新缓存……自己阐述。。。。
总结:下午基本是围绕数据库(内存数据库和关系型数据库)的一些问题……
#社招##面经##Java工程师##来电科技#