面试心得
要求
- 扎实:对所学的内容有较好的掌握和思考;
- 聪明:能够举一反三,触类旁通;
- 主动:能够主动去分析处理问题;
- 进取:乐于学习,并能应用到实践;
常见问题
操作系统
- 进程/内存/cpu查看
- 文件搜索
- 进程(ps -ef),CPU,网络连接等资源的查看方式
- 端口数,跟链接数的关系(套接字,文件描述符含义)
- 进程虚拟地址空间,实际物理空间,wap空间
- 内存管理机制:段页式,页大小(可联想到磁盘存储的块大小),底层实现原理
- 目录切换的命令(cd -, cd ~…)
- chmod 755, 644含义(当前用户,当前用户组,其他用户)
- kill -9 的具体逻辑,是否了解过其他数字
网络
- socket和 ip:port 的关系;
- 端口数,最大值,耗尽,连接数上限,如何处理;port数65535-1024,如何会有c10k,c100k的链接?
- TCP连接:握手挥手,握手阶段对应linux的基本实现逻辑;(accept->establish)
- accept具体服务端执行什么操作
- close_waited状态,连接出现connect refused,实际tcp的指令是?(RST)
- 网络传输分包大小 MTU
- 带宽的含义?传输速率有没有极限?(香农定理)
- 127.0.0.1具体是什么
- TCP,UDP的区别,及应用场景
- DNS解析流程
- CDN又是什么
- 常用指令:netstat,ss
- 内网ip段如何识别?
- XFF头?
- IP单个报文最大传输长度?1500,实际传输数据过长会发生哪些问题,怎么处理?
- 路由探测协议?ARP
- 什么情况下会有大量的CLOSE_WAIT状态?怎么处理(收到对端FIN之后,没有主动FIN)
- http,https,http2,http3
Java基础
- java最新版本是?特性是?
- 当前使用的版本是?主要特性是?
- jvm参数
- 内存模型,垃圾回收(版本差异)
- 类加载机制,接口;
- 线程状态:sleep 方法没有释放锁,而 wait 方法释放了锁
- 线程池,参数?submit,run…(如何实现同步等待)
- corePoolSize:核心线程数线程数定义了最小可以同时运行的线程数量。
- maximumPoolSize : 当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
- workQueue: 当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。
- 并发包:AQS,几种同步方式;锁(wordmark,锁降级等原理),java.util.concurrent.locks 包下
- 实现原理:被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
- CyclicBarrier(两组线程池之间等) 和 CountDownLatch(N个线程间互相等)区别
- hashmap等集合类原理:map的并发操作问题,怎么遍历–联想到stream API)
- haspmap1.8开始,扩容>64 转红黑树,<? 退化为列表?
- Iterator使用 hashNext()/next()遍历下一个元素之前,都会检测 modCount 变量是否为 expectedModCount 值,是的话就返回遍历;否则抛出异常ConcurrentModificationException,终止遍历。通过 Iterator 的方法修改集合的话会修改到 expectedModCount 的值,所以不会抛出异常
- java1.8开始,ConcurrentHashMap 取消了 Segment 分段锁,采用 CAS 和 synchronized 来保证并发安全。数据结构跟 HashMap1.8 的结构类似,数组+链表/红黑二叉树。
- 异常:受检异常,非受检异常,运行时异常举例,throwable –> Exception,Error Exception –> RuntimeException,…
- transient关键字:屏蔽对应字段的序列化操作;
- 深拷贝,浅拷贝
- 原子类:
- CAS (compare and swap) + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销。
- 基本类型原子类只能更新一个变量,如果需要原子更新多个变量,需要使用 引用类型原子类。
Java进阶
- syncronizd(监视器),volatile(lock指令,有序性,一致性),原子类
- threadlocal原理
- 单例的几种实现机制
- 反射原理:newInstance;
- 动态代理;(CGLIB通过继承方式实现——final方法无法代理,private方法无法代理)
- 泛型;
- IO模型:同步/异步,阻塞/非阻塞;select,epoll(同步非阻塞)
- 链路跟踪的实现思路
- lambda实现原理:
- 在类编译时,会生成一个私有静态方法(属于当前类)+一个内部类;
- 在内部类中实现了函数式接口,在实现接口的方法中,会调用编译器生成的静态方法;
- 在使用lambda表达式的地方,通过传递内部类实例,来调用函数式接口方法(dynamicinvoke)。
调测
- 常用手段:jstat,jmap,jstack,cpu,mem,gc….
- CPU很高,什么场景,怎么定位
- 负载很低,也不响应请求
Mysql
- 事务隔离级别;
- 锁的类型;
- 索引原理;
- 索引优化;
开源框架
- spring:生命周期,启动加载流程,事务传播机制,作用域
- springboot:注解;
- mongodb:索引,排序
- redis:一致性hash,持久化,主从同步,集群管理,事务,多线程(6.0)
- elasticsearch
- mq:rabbitmq,kafka
- nginx,tomcat,mongodb….
- 日志框架
- 序列化框架
- 分布式事务
- 容器化,servicemesh:vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,docker直接使用硬件资源,- 虚拟机是操作系统级别的资源隔离,而容器本质上是进程级的资源隔离。
设计模式
算法
- int长度 4;
- 将一个负数integer转换为long(能够提出最高位截断位数不确定)
1) int i = -1000;
long l = i & 0xFFFFFFFFL;
long l = 0x100000000L + i;
2) Guava UnsignedInts.toLong(int)
3)Java 8 : Integer.toUnsignedLong(someInt)
- 计算一个数的开平方;
- 链表倒序,排序
- 二叉树遍历(深度,广度)
- 排序算法
- 流控算法:令牌桶,滑窗,漏桶
- map内容输出排序
- 爬格子:每次爬一步或者两步,N个格子走完,有多少种方法
- 中位数:一个无序链表|数组,排序后,获取中间位置的数;扩展数组集合非常大
- 列表重排:奇数位连续,偶数位连续;首尾依次交叉
- 单调栈:给你两个数组 nums1和 nums2 ,其中nums1 是 nums2 的子集。 请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。 nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素 。 输入: [2,4] [1,2,8,6,4,3,5] 输出:[8,5]
- 全排列
- 字符串转数字
- 除法实现
- 循环队列检测
- 分表场景下,实现一个分页遍历的算法
- booth算法:乘法器:100010001 * 11 ->100010001 < 1 + 100010001
- tried树
其他问题
- 缓存数据量过大的解决(布隆过滤器)
- “”+ Object,(String)Object 区别
开放问题
- 介绍一个比较记忆深刻的项目
- 自己承担的角色,起到的作用,效果如何,改进有么
- 日常兴趣:对技术的偏好
- 学习来源:经常关注的技术,论坛,公众号,最近看到的公众号或者文章内容
- 学习方式;
干什么用的 –> 怎么用 –> 怎么实现 –> 为什么要做这个东西