## 长亮一面
视频面试,时长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+
- 面试突击
- Java虚拟机
- 认识字节码
- 000Java发展历史
- 000Macos10.15.7上编译OpenJDK8u
- 001熟悉Java内存区域
- 002熟悉HotSpot中的对象
- 003Java如何计算对象大小
- 004垃圾判定算法与4大引用
- 005回收堆和方法区中对象
- 006垃圾收集算法
- 007HotSpot虚拟机垃圾算法实现篇1
- 007HotSpot虚拟机垃圾算法实现篇2
- 007HotSpot虚拟机垃圾算法实现篇3
- 008垃圾收集器
- 009内存分配与回收策略
- 010Java虚拟机相关工具
- 011调优案例分析
- 012一次IDEA的启动速度调优
- 013类文件Class的结构
- 014熟悉字节码指令
- 015类加载机制(过程)
- 016类加载器
- IDEA的JVM参数
- Java基础
- Java自动装箱与拆箱
- Java基础数据类型
- Java方法的参数传递
- Java并发
- 001走入并行的世界
- 002并行程序基础
- 003熟悉Java内存模型JMM
- 004Java并发之volatile关键字
- 005线程池入门到精通
- 006Java多线程间的同步控制方法
- 007Java维基准测试框架JMH
- 008Java并发容器
- 009Java的线程实现
- 010Java关键字synchronized
- 011一些并行模式的熟悉
- 单例模式和不变模式
- 生产者消费者模式
- Future模式
- 012一些并行算法的熟悉
- 面试总结
- 长亮一面