面试之路
2021.1.25上午 - 创业型公司面试:
主要是做公司相关系统的需求分析:
实现功能的时候会需要用到几个接口;
在用户体验和实用功能两方面做取舍。
2021.1.28下午:
-------------------海心电话面试--------------------------
1..HashMap底层实现,hash冲突如何解决:
答案:HashMap的实现使用了一个数组,每个数组项里面有一个链表的方式来实现,因为HashMap使用key的hashCode来寻找存储位置,不同的key可能具有相同的hashCode,这时候就出现哈希冲突了,也叫做哈希碰撞,为了解决哈希冲突,有开放地址方法,以及链地址方法。
2.用户使用同一个模块的时候,如何提高效率:分布式相关的,不太了解
3.线程(进程和线程区别)
答:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。(我的回答:线程是进程的一部分,一个进程可以有多个线程,狗头)。
4.Java集合
5.SQL语句:找到班里两门成绩不及格的学生。(表中:成绩、学号、姓名)
6.Map是否为线程安全,线程不安全情况举例(不安全情况没有举上来):
答:HashMap会进行resize操作,在resize操作的时候会造成线程不安全。下面将举两个可能出现线程不安全的地方。
1、put的时候导致的多线程数据不一致。
这个问题比较好想象,比如有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落 到的桶的索引坐标,然后获取到该桶里面的链表头结点,此时线程A的时间片用完了,而此时线程B被调度得以执行, 和线程A一样执行,只不过线程B成功将记录插到了桶里面,假设线程A插入的记录计算出来的桶索引和线程B要插入的 记录计算出来的桶索引是一样的,那么当线程B成功插入之后,线程A再次被调度运行时,它依然持有过期的链表头但 是它对此一无所知,以至于它认为它应该这样做,如此一来就覆盖了线程B插入的记录,这样线程B插入的记录就凭空 消失了,造成了数据不一致的行为。
2、另外一个比较明显的线程不安全的问题是HashMap的get操作可能因为resize而引起死循环(cpu100%)
7.如何保证线程安全,用什么程度的锁:
答案:1)synchronized同步代码块 2)lock接口 3)volatile+CAS【单纯的volatile是轻量级的同步机制保证可见性但是不具备原子性所以要配合CAS来实现线程安全】
4)atomic原子类【比较冷门,大家可以去看看】
2021.1.28下午 兰宇技术测试
A.主要是一些分布式数据库的理论
B.编程题是返回访问TopN 的url列表(去年在面一个分布式数据库的公司的时候也遇到过一样的题)
2021.2.1 19:00恒生电子
1.自我介绍
2.项目介绍,自己负责什么?
3.Spring了解吗,那用的是Spring MVC嘛?
4.设计模式?
5.看我研究生学的都是算法,那有哪些排序算法
6.网络协议?五层模型和OSI七层模型(分别是哪些)
物理层->数据链路层->网络层->传输层->回话层->表示层->应用层
TCP/IP五层模型的协议:应用层->传输层->网络层->数据链路层->物理层
7.其他记不太清了
2021.2.1 20:30阿里钉钉
1.自我介绍
2.自己做的项目的介绍,自己主要做了什么(我介绍了仿区块链项目)
3.我问了,那了解区块链吗?知道相关技术吗(不知道!!!)
4.Spring用过吗,为什么要用Spring
5.知道设计模式吗?可以介绍一个吗?
6.为什么要用单例模式?
7.JVM垃圾回收机制(我说我这一星期准备就看了这个,他就说不问了!!!哭唧唧)
8.知道垃圾回收机制,那还会发生内存溢出吗?什么情况下会发生?(什么情况会发生没回答上来)
答:
9.url到浏览器发生了什么?(面试前的面经看到了。。。)
10.手撕代码,两个问题选一个写,如下:
题目1. 有m个人(m=100),每个人一个号码牌(1-100) ,围成一个圆,从第一个人开始数,每数到7淘汰该人,
下一个人继续从1开始计数并到7淘汰,以此类推,问最终剩下的人手里的号码牌是几?
题目2. 区间合并:
- 输入:一组有序的数字区间,按照每一个区间的最小值从小到大排列
- 输出:合并所有相邻的重叠区间并返回
- 例如:
- 输入:(1, 4), (2, 5), (5,6), (8,9)
- 输出:(1, 6), (8, 9)
2021.2.2 10:00 海心技术二面
1.自我介绍
2.tcp/ip协议了解吗?tcp和udp的区别?
3.三次握手,四次挥手过程什么样,为什么挥手需要四次
4.有哪些排序算法,思路是什么样的,算法复杂度多少?
5.HashMap是怎么实现的,看过具体代码吗?
6.Java为什么会发生内存泄漏?如何解决?
答:生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景;根据不同的情况,进行解决:
1)java堆内存溢出
原因:设置的jvm内存太小,对象所需内存太大,创建对象时分配空间,就会抛出这个异常。
解决:首先,如果代码没有什么问题的情况下,可以适当调整-Xms和-Xmx两个jvm参数,使用压力测试来调整这两个参数达到最优值。
其次,尽量避免大的对象的申请,像文件上传,大批量从数据库中获取,这是需要避免的,尽量分块或者分批处理,有助于系统的正常稳定的执行。
最后,尽量提高一次请求的执行速度,垃圾回收越早越好,否则,大量的并发来了的时候,再来新的请求就无法分配内存了,就容易造成系统的雪崩。
2)java堆内存泄漏
原因:Java中的内存泄漏是一些对象不再被应用程序使用但垃圾收集无法识别的情况。因此,这些未使用的对象仍然在Java堆空间中无限期地存在。
解决:相对来说对应的解决方案比较简单:重写equals方法。
3)垃圾回收超时内存溢出
原因:当应用程序耗尽所有可用内存时,GC开销限制超过了错误,而GC多次未能清除它,这时便会引发java.lang.OutOfMemoryError。当JVM花费大量的时间执行GC,而收效甚微,而一旦整个GC的过程超过限制便会触发错误(默认的jvm配置GC的时间超过98%,回收堆内存低于2%)。
解决:要减少对象生命周期,尽量能快速的进行垃圾回收。
4)Metaspace内存溢出
原因:原因是系统的代码非常多或引用的第三方包非常多或者通过动态代码生成类加载等方法,导致元空间的内存占用很大。
解决:A.优化参数配置,避免影响其他JVM进程;B.慎重引用第三方包; C.关注动态生成类的框架
5)直接内存内存溢出:
原因:如果你在直接或间接使用了ByteBuffer中的allocateDirect方法的时候,而不做clear的时候就会出现类似的问题。
解决:如果经常有类似的操作,可以考虑设置参数:-XX:MaxDirectMemorySize,并及时clear内存。
6)栈内存溢出
原因:当一个线程执行一个Java方法时,JVM将创建一个新的栈帧并且把它push到栈顶。此时新的栈帧就变成了当前栈帧,方法执行时,使用栈帧来存储参数、局部变量、中间指令以及其他数据。当一个方法递归调用自己时,新的方法所产生的数据(也可以理解为新的栈帧)将会被push到栈顶,方法每次调用自己时,会拷贝一份当前方法的数据并push到栈中。因此,递归的每层调用都需要创建一个新的栈帧。这样的结果是,栈中越来越多的内存将随着递归调用而被消耗,如果递归调用自己一百万次,那么将会产生一百万个栈帧。这样就会造成栈的内存溢出。
解决:如果程序中确实有递归调用,出现栈溢出时,可以调高-Xss大小,就可以解决栈内存溢出的问题了。递归调用防止形成死循环,否则就会出现栈内存溢出
7)创建本地线程内存溢出
原因:线程基本只占用heap以外的内存区域,也就是这个错误说明除了heap以外的区域,无法为线程分配一块内存区域了,这个要么是内存本身就不够,要么heap的空间设置得太大了,导致了剩余的内存已经不多了,而由于线程本身要占用内存,所以就不够用了。
解决:首先检查操作系统是否有线程数的限制,使用shell也无法创建线程,如果是这个问题就需要调整系统的最大可支持的文件数。日常开发中尽量保证线程最大数的可控制的,不要随意使用线程池。不能无限制的增长下去。
等等。
7.场景题:如何设计一个推荐的功能
2021.2.2 哈罗一面
1.自我介绍
2.项目介绍,自己做了什么
3.项目中用到了签名,他问我用的什么算法,我说SHA-256。
4.他说那还有什么类似的算法吗,我说SHA是一个家族,都是一系列的。(其实就是实现区块链的加密技术。。。)
5.那SHA-256是哈希算法吗(我说应该不是,就是安全散列算法----但后面查了查好像算是哈希算法吧,)(他说,他也了解的不多。。。)
6.问我用了哪些框架(我说用的不多,了解过Spring和Angular,就没再细问)
7.你对Java有什么了解?(我说看了JVM的书)你看的书叫什么?
8.堆和栈的区别?什么情况下对象会在栈内分配(我回答,大部分是在堆,当对象未能逃逸出方法则会在栈内分配)
9.年轻代和老年代各自有什么垃圾回收算法
10.JVM的内存结构?
11.新的对象会直接到老年代吗?(极端情况下还是会的)
12.GC回收器有哪些?
13.CMS跟新生代并行回收有什么区别?具体步骤?
14.线程安全的集合?(我说Vector还是安全的,只不过用的不多了,还有就是Hashtable)用过concurrentHashMap吗
15.ReentrantLock与synchronized区别
16.MySQL知道什么(我说就是平时的读取存储数据,还有对不同的索引进行性能分析-我真是给自己挖坑)他说对性能分析感兴趣,问我怎么进行分析的(哭唧唧,都不太记得了)
17.聚集索引和非聚集索引区别
18.乐观锁和悲观锁
19.除了MySQL之外还了解什么中间件吗?
20.平时怎么学习的?
21.手撕代码:https://leetcode-cn.com/problems/base-7/