ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 长亮一面 视频面试,时长1小时。 ## 总结 * 发现时间和能力不成正比,实力需要加强。 * 学习知识需要加深理解,不能只在表面或者靠背。 * 开源项目源码需深入。 ### 开局自我介绍 面试官您好!我的名字叫xx,来自湖北武汉,软件工程专业毕业。到目前为止,从事过2个行业,在浪潮做了5年电子政务,来平安做了1年人事行业。 ### 介绍最近的项目 HPaaS后端框架及IDE,参与后端框架设计,主导配套IDE的设计及实现。从代码下载,代码生成,代码拖拽辅助,代码编译打包等功能实现,最后交由自动发布平台通过流水线发布到k8s中部署。 ### 为什么离职? 一年内人事调动频繁。 ### 为什么要用二叉树? (为什么要用,其实就是在问优点) 数组插入太慢搜索快,链表查询太慢插入快,二叉树整合了二者的优点。 在树中查找数据的速度和有序数组中查找一样快,并且插入数据和删除数据的速度和链表一样。 ### Java并发有用到那些点 cas,volatile,synchronized,线程池等 (Future,Fork/Join等) ### volatile有什么特性 * 防止指令重排序(内存屏障实现的); * 保证变量在多线程(多核)可见性(当修改volatile变量时,虚拟机会给cpu发送一个信号告诉其他cpu这个变量已修改,当其他cpu调用这个变量时,就会先检查是否有收到修改该变量的信号,有则重新从主存中读取。volatile是无锁的,类似于乐观锁的机制)。 ### 为什么用线程池? 多个任务需要并行执行,加快处理速度,提高系统吞吐;多线程方式会无法控制线程数量,且性能多浪费在线程创建和销毁时;而使用线程池能解决这些问题。 因为线程创建和销毁都会进行系统调用(用户态和内核态来回切换,消耗资源),为了减少创建和销毁的消耗,用线程池来管理线程,以及线程复用。 可参考:https://www.zhihu.com/question/41134816 1. 核心线程数(corePoolSize)不宜过多(若为3),线程池创建完后还没有执行过任务时线程数是0。先执行1个任务,线程池会创建出来一个线程来执行该任务,此时线程数为1。 再执行第2个任务,线程池会创建第二个线程来执行该任务,此时线程数为2。且2个任务都执行完成,2个线程均空闲。 再执行第3个任务,线程池还是会创建第3个线程来执行该任务,此时线程数为3。 后续第4个任务,线程数已经达到了设置的核心线程数3,不会再创建,让其中一个线程去执行该任务。 2. 又有很多任务来了,此时就需要一个工作队列(WorkQueue)来让任务排队。(生产者消费者模式)工作队列是一个有界的阻塞队列,阻塞是指当队列为空时,获取任务的线程状态是阻塞的(不占用cpu资源),等工作队列有任务后,获取任务的线程会被唤醒继续运行。 3. *在 workQueue 已满的条件下,如果当前线程池的线程数量 >= corePoolSize 且 <= maximumPoolSize,后续如果一直有其它线程丢任务进来,会一直创建线程,直到 maximumPoolSize。* ### 什么场景下用的呢 调度程序在网络间传送大文件,比如500M,传输接口限制每次只能发送4M大小的数据。 于是做分片,利用线程池并行发送分片数据。 ### 线程池里线程数扩缩容机制 始线程池里线程数是0,执行任务后,会创建到核心线程数大小。若工作队列满了,则创建到最大线程数大小。空闲后,则维护线程数到核心线程数大小。 ### 有线上环境问题处理的经验吗? 发现系统长时间运行后会内存溢出导致服务挂掉,后来发现是http调用工具里资源未释放导致。 (是HttpClient吗?需要关闭吗?我回答要关闭) ### JVM类加载 加载,链接(验证,准备,解析),初始化,使用,卸载。 ### JVM卸载一个类的要满足什么前提条件 * 该类所有的实例都已经被回收。 * 加载该类的ClassLoader已经被回收。 * 该类对应的java.lang.Class对象没有任何地方被引用。 ### 设计模式用了哪些 单例,适配器,观察者,门面等。 分别说下是在什么场景下用的。 ### 设计模式6大原则 。。。。 ### 设计模式原则里的开闭原则是什么 。。。 ### IO模型有哪些 * BIO - 同步阻塞IO * NIO - 同步非阻塞IO * 多路复用器 select * poll * epoll * AIO - 异步IO ### 多路复用器是什么?带来了什么好处? ### 为什么不用异步IO呢? ### CAP理论,你是如何理解的? ### ZK是CP还是AP什么的?为什么? ![](https://img.kancloud.cn/a0/16/a01650935de329e16bda226a2fab1799_1460x1212.png) ### 分布式锁,请说说在什么场景下用到的呢? 在服务端多节点部署时,预约号保证顺序时加了分布式锁。 ### 不用分布式锁,可以用其他方案代替吗? 自己的答案:可以用消息队列,顺序消费后会写结果,前端轮询查询结果。(方案有点重,我说应对高并发大流量时是这么做的) 查找资料后的答案:路由 + Java锁机制。分析需要使用分布式锁的业务流程,找到合适的路由规则,将请求路由到统一节点并且配合Java的锁实现同步。 ### 有开源项目源码研究和二次开发经验吗? 。。。(没有,大多是使用) ### 对薪水有什么要求? 30k+