diff --git a/src/note/0interview.md b/src/note/0interview.md deleted file mode 100644 index 9f42594952..0000000000 --- a/src/note/0interview.md +++ /dev/null @@ -1,466 +0,0 @@ ---- -title: 秋招面经 -icon: biji1 -date: 2023-09-02 -star: true -category: - - 面经 -tag: - - Java - - 面经 ---- - -⁉️ 个人回答不保证正确 - -## 得物 - -### 一面 - -#### 说一说 CMS 和 G1 垃圾收集器 - -- CMS 是标记清除算法的垃圾回收器,运行流程分为初始标记、并发标记、重新标记、并发清除,其中初始标记和重新标记会产生 STW,对在并发标记阶段修改的引用采用增量更新方法,G1 将堆内存分为多个 Region 区域,可以作为年轻代或者老年代,运行流程分为初始标记、并发标记、最终标记、筛选回收,其中除了并发标记阶段都会产生 STW,对并发标记阶段产生的引用链修改采用原始快照的方法。 - -##### ReentrantLock 中的公平锁和非公平锁是怎么实现的? -- ReentrantLock 基于 AQS 实现,其中有公平锁实现和非公平锁实现,对对象的加锁过程就是修改对象的 state 过程,采用 CAS 进行修改,修改失败表示有竞争,则会创建为一个 CLH 节点放入到 CLH队列的尾部,CLH 队列是一个虚拟的双向队列,其中存储了线程关系,存放在这个队列中的节点都是为竞争锁失败的节点。 -- 公平锁实现:如果锁被释放,则会唤醒 CLH 队列中头节点的后一个节点,来竞争加锁,此时如果有一个新的线程也想进行加锁,则会检查 CLH 队列中头节点之后是否有节点,有节点则表示之前已经有线程等待了,则将自己放入 CLH 队列尾部。 -- 非公平锁实现:在有新线程想加锁时,不管 CLH 队列中头节点之后是否有节点在等待,直接使用 CAS 尝试加锁。 - -#### redo log 和 undo log 的作用? -- redo log 用来记录数据库的修改,主要用来做崩溃恢复的,undo log 配合隐藏字段、Read View 实现 MVCC。 -- **redo log 文件是啥样的?**(没太懂啥意思) -- redo log 在磁盘中以日志文件组的形式出现,可以看成一个循环队列,包含 checkpoint 和 write pos,如果 write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log 记录。 -- **redo log 是顺序写吗?** -- 是顺序写,如果对每次修改之后将一个页写回,可能只修改了很少的数据,没有必要这样做,并且页还不是顺序写效率较差,如果是 redo log 写,又是顺序写,整体效率较高。 - -#### 两阶段提交了解吗? -- 两阶段提交指的是 redo log 的提交分为两个阶段,分别是 prepare 和 commit,在 prepare 之后 binlog 写入,然后再 commit。 -- 如果在 prepare 之后,出现问题,导致 binlog 写入失败,则发现没有对应的 binlog,事务将会回滚,如果是在写 binlog 之后发生错误,即使 redo log 没有 commit,但是有 binlog 则表明事务提交成功了,事务不会回滚。 - -#### Spring 事务说说 -- Spring 中事务通过 @Transactional 注解对方法提供事务支持,原理是创建一个动态代理对象,由动态代理对象执行这个方法,并对前后进行增强,也就是在执行数据库操作前将事务的提交模式改为手动,再进行数据库操作,发生异常则进行回滚。 - -#### 什么情况下会产生事务失效? - -- 方法没有被 public 修饰,因为 CGLIB 动态代理是生成一个子类进行调用,如果父类方法不是 public 则调用不了。 -- this 调用,需要使用动态代理对象调用方法才能让事务失效,this 调用是普通对象的调用。 -- 异常没有正确抛出,如果内部将异常捕获了,外部 Spring 感知不到则会导致事务失效。 -- 事务的传播机制设置错误,例如设置为 NEVER 则表示不使用事务。 -- 数据库本身不支持事务。 - -#### 什么情况下使用编程式事务什么情况下使用注解式事务? - -- (不太明白,我直接说没有用过编程式事务) -- 编程式事务能在任何的代码片段中添加事物,而注解式事务的要求条件比较多,灵活性不如编程式事务。 -- 注解式事务会导致方法开始的时候就申请连接,可能导致连接的利用率不高,不如编程式事务。 - -#### SSL/TSL 了解吗? -- (不了解)不太了解,只知道 HTTPS 是基于 SSL/TSL 实现的,这两个都是建立在 TCP 链接基础上的协议。 -- HTTPS 为了防止中间人篡改信息,引入了证书机制,证书就是身份信息 + 公钥,将公钥发送给客户端,客户端通过上层证书提供商检查证书合法性,通过之后则会产生一个秘钥,秘钥通过公钥进行加密,到了服务器端通过私钥进行解密。服务器得到秘钥,之后的数据传输用这个秘钥进行对称加密。 -- 总结就是发送的数据通过对称加密,加密使用的秘钥通过非对称加密。 - -#### 国内输入谷歌网站但是访问不到,发生了什么? -- 正常访问网页首先是通过域名 DNS 解析得到 IP 地址,查询方式有迭代查询和递归查询。之后与服务器建立 TCP 连接,然后发送请求到服务器,服务器返回数据,浏览器渲染。 -- **访问不到 Google 的原因是在哪个环节?** -- 我先说是 DNS,后来想了下回答是 TCP 连接环节。 -- **防火墙在哪一个环节生效?** -- TCP 连接环节,因为 TCP 是端到端的协议,需要提供端口,配置防火墙的时候需要添加入站和出站的端口。 - -#### 反问 - -### 二面 - -#### 学习中遇到困难如何解决的?请举例。 - -- 举了 float 浮点数的精度丢失问题,如何解决。线程安全问题,例如对 int 变量的并发修改问题,如何解决,volatile 关键字的实现原理,再延伸到 JVM 内存模型。 -- 几乎没有太多技术性的问题。 - -## 富途 - - -### 一面 - -#### 自我介绍 - -#### 谈谈你对测试流程的理解 - -- 最近才开始学测试,整体流程不是太了解,我认为是编写好文档,然后设计好输入的样例,查看输出结果是否能对应上。 - -#### 为什么想投递测试? -- 因为 Java 开发竞争太大了,而且会后端代码,能更好的做白盒测试。 -- **其实竞争都挺大,哈哈。** - -#### 对数据库的查询,数据进行排序获取前十个用什么关键字? -- 使用 order by 和 limit。 -- **如果进行分组呢?** -- group by。 - -#### 发现数据库查询的速度变慢,会想到什么优化措施? - -- 尽量减少 select * 的查询,如果数据库的数据太多,可以使用分库分表,经常查询的字段可以添加索引。 - -#### 数据库死锁了解吗? - -- 操作系统中定义的死锁为有两个或者多个进程因为竞争资源导致阻塞,如果没有外力作用,两者都无法向前推进。 -- 数据库中的死锁发生在两个事务对数据加锁并且请求修改对方加锁的数据。 -- -#### 常见的 HTTP 状态码说下 - -- 200 请求成功,301 永久重定向,302 临时重定向,400 客户端错误,401 未授权,403 访问拒绝,404 页面没有找到,500 服务器错误,502 网关错误,504 网关超时。 - -#### GET 和 POST 区别 - -- GET 用来请求数据,POST 用来插入数据。 -- GET 幂等,POST 不幂等。 -- GET 的参数放在 URL 中,POST 放在 Body 中。 -- 这些都是规范,也可以不遵守,将后端的处理做好即可。 - -#### TCP 和 UDP 的区别 - -- TCP 面向连接,字节流,可靠的传输层协议。 -- UDP 不面向连接,不可靠的传输层协议。 -- TCP 是端到端的协议,双方需要通过三次握手建立连接。 -- UDP 可以产生广播消息,TCP 不可以。 -- **UDP 适用于哪些场景?** -- 视频对话,语音对话,对正确性要求不高的场景。 -- TCP 适用于对要求高的场景,例如 FTP、POP3、SMTP、SSH 协议等都是基于 TCP 的。 -- **那么我在腾讯视频看视频的时候应该用的是哪种传输协议?** -- 应该是 TCP 吧,看视频其实就是文件传输的过程,使用 FTP 将文件传输到本地,然后通过播放器播放,对文件的完整性要求高。 - -#### 如果有八个球,其中七个球的重量是相同的,另外一个球稍微重一点,给你一个天平,需要多少次比较能得到最重的球? - -- 刚开始想到的是二分查找,首先 4V4,然后 2V2,再 1V1。 -- **不对,还可以做优化。** -- 能给点提示吗? -- **例如三个球,当中有一个重一点,则需要几次比较?** -- 一次,选择两个球,如果当中有一个重,则就是目标球,如果两个重量相等剩下的就是目标球。 -- 所以八个球的场景下,应该先 3V3,如果有一边重,则退化为三个球的场景,如果同样重,则最重的球在剩余两个球中,需要一次比较。 - -#### 有一根绳子,从一边开始烧,烧完需要一个小时,则如何通过烧绳子计时 1 小时 15 分钟? -- 首先用两根绳子,当中一个从两边开始烧,需要半个小时烧完,另外一个先从一边开始烧,到了半个小时之后将另外一边点燃,则再过 15 分钟烧完。 -- 剩余一个小时再烧一根绳子即可。 - -#### 代码题爬楼梯 - -- 动态规划 - -#### 有 n 个人,他们各自有一个礼物,送给其他人,并且不能拿到自己的礼物,打印所有情况 - -- (回溯光速写完,以为秒了)。 -- **有个 BUG 你发现了吗?例如有五个人,前四个只拿到了前四个人的礼物,则最后一个人只剩下自己的礼物怎么办?** -- 跟前面任意一个人交换礼物即可。 - -#### 代码题,找出无序数组中的最大值和最小值 - -- 线性查找 - -#### 反问 - -### 二面 - -#### HashMap底层结构 - -#### 从 1 ~ N 的数字中随机取出 M 个 数字,时间复杂度要求为 M - -#### 52 张扑克牌中,取出炸弹的概率大还是顺子的概率大? - -#### 有 10 个袋子,每个袋子里面都有 100 个硬币,其中 9 个袋子中的硬币重量是相同的,都是 10 克,另外一个袋子里的硬币是 9 克,如果只用一次带刻度的电子秤,找到 9 克硬币的袋子的方法 - -## 快手 - -### 一面 - -#### 自我介绍 - -#### 对电商项目的优化 - -- 更改了 JVM 中的老年代和新生代的内存分布,将秒杀的并发量提高。 -- 使用 CompletableFuture 对 SKU 数据进行异步查询,提高了查询速度。 -- 登录部分由原来的手动查询用户数据密码比对,改为了使用 SpringSecurity 进行登录认证,简化了开发步骤,另外使用 Redis 解决分布式下的用户数据共享。 -- 使用 Sentinel 限制后端并发数,熔断降级保证服务安全可用。 - -#### 虚拟内存的概念 - -- 虚拟内存是解决内存紧张的问题,对应于操作系统调度中的中级调度,在程序运行时并不要把所有的数据都放入内存,并且在内存紧张时将部分暂时不会执行的进程放入到磁盘中,等到内存够用时再将其调回内存。 - -#### 操作系统中文件的实现 - -- 单级目录结构和多级目录结构以及图形目录结构的优缺点。 - -> 现在想起来面试官问的应该是文件的逻辑结构和物理结构。 -> -> 逻辑结构分为顺序,索引和顺序索引结构。 -> -> 物理结构的实现分为 -> -> - 连续分配,在目录中设置对应文件的开始块号和结束块号。 -> -> - 链接分配分为隐式链接和显式链接,隐式链接可靠性差,显示连接的指针占用空间,并且可靠性也不好。 -> - 索引分配,为每个文件分配一个索引分配表,表中记录了属于这个文件的磁盘块,不仅支持随机访问,而且不会产生外部碎片。 -> - 混合索引分配,既有直接地址分配,又有多级索引分配。 - -#### 多级缓存的作用 - -- (这玩意书上怎么没看到),我说我对硬件有所了解,CPU 中的缓存就是多级缓存,现在的 CPU 一般包含三级缓存,分别是 l1,l2,l3,速度逐渐降低,容量逐渐扩大,使用多级缓存能很好的解决 CPU 速度和主存速度不匹配的问题,就像主存用来解决 CPU 和 磁盘之间的速度差异一样。 - -#### 访问一个网址的过程 - -- 首先通过 DNS 解析为 IP 地址,再和 IP 地址进行 TCP 三次握手,将请求发送给服务器,服务器处理之后返回解析的数据,浏览器展示。 - -#### TCP 三次握手说说 - -- 首先客户端发送数据到客户端,当中有 `SYN=1,seq=x`,服务器收到数据之后返回确认 `SYN=1,ack=x+1,seq=y`,客户端收到确认之后返回确认`ack=y+1,seq=x+1`。 - -#### HTTP 和 HTTPS 的区别 - -- **端口号**:HTTP 默认是 `80`,HTTPS 默认是 `443`。 - -- **URL 前缀**:HTTP 的 URL 前缀是 `http://`,HTTPS 的 URL 前缀是 `https://`。 - -- **安全性和资源消耗**:HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。 - -#### 常见的 Request Header - -- `Accept`:请求报头域,用于指定客户端能接受哪些类型的信息。 -- `Host`:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的地址。 -- `Referer`:表示当前的请求是从哪个 URL 过来的,一般可以用来做反爬虫,不是本站发送的请求就不会响应。 -- `Connection`:分为 `close` 和 `keep-alive` 用来表示发送完请求的对象之后是关闭连接还是持续的连接。 -- `Access-Control-Allow-Origin`:允许跨域时添加的参数,用来表示哪个源地址发来的请求允许跨域。 -- `Cache-Control`:控制是否能缓存数据。 -- `Accept-Language`:浏览器支持的语言。 -- `Accept-Encoding`:浏览器支持的编码方案。 - -#### 数据库为什么比 Redis 慢? - -- 数据库需要从磁盘中读取页来进行查询,而 Redis 是在内存中操作,所以速度更快,另外 Redis 使用多路复用技术使得并发量进一步提高。 - -#### 如果一张表中有太多的列和太多的行,怎么进行优化? - -- 水平分表和垂直分表,将数据分散到多张表中以解决单表的并发度问题。 - -#### 算法题 - -- 链表右移,右移的元素放入到头部 -- 例如 1->2->3->4,右移 1 次之后变成 4->1->2->3,求出右移 k 次之后的链表,秒了。 - -#### 反问技术栈 - -### 二面 挂 - -> 面出阴影了。 - -#### 介绍一下线程池 - -- 介绍了线程池参数,拒绝策略,常见的线程池实现,任务队列的类型等。 - -#### 线程池的好处 - -- 减少了线程频繁创建销毁的开销。 -- 提高响应速度。 -- 提高线程的可管理性。 - -#### 线程切换为什么比进程切换开销小? - -> 傻逼了,背了不知道多少遍线程切换开销小,怎么就没想过这个问题的答案呢。 - -进程是资源管理的基本单位,线程只拥有小部分提供自身运行的资源。进程在切换时会导致快表 TLB 失效(快表中存储了最近进程访问的页面映射,可以加快虚实地址转换速度),进程切换时要切页表,而且往往伴随着页调度,因为进程的数据段代码段要换出去,以便把将要执行的进程的内容换进来。而线程只需要保存上下文信息(状态寄存器和栈信息)。 - -#### 在项目中如何通过场景的不同给定线程数目? - -- 在 CPU 繁忙的项目中,将核心线程数设置为 N + 1,N 为 CPU 核心数,多出来的 1 用来处理偶然发生的缺页中断。 -- IO 密集型设置核心线程数为 2N,系统大部分时间用来处理 IO 交互,处理 IO 的时候就不会占用 CPU 资源,这时可以将 CPU 交给其他任务。 - -> 面试管说在 IO 繁忙型的项目中,不应该设置这么多的核心线程,因为在 IO 的时候线程是会阻塞的,设置多个线程没有作用。 - -#### 假如我是个小白,如何向我解释并发编程? - -- 我觉得 Java 的主要优势就是多线程的并发执行,在并发执行的过程中,如果不加以限制就会导致结果出现错误(并行语义之间不保证顺序性),因此并发编程就是学习在各种业务场景下保证线程安全,并学习 JDK 中的各种并发安全的类。 - -#### 说说 Java 当中的锁 - -- 互斥锁和共享锁算分类吗? -- **算的,举个例子。** -- 例如同步锁 synchronized 关键字就是互斥锁,另外还有基于 AQS 实现的 ReentrantLock、CountDownLatch、CyclicBarrier。 -- **如果对实例方法加锁,锁住的是什么?** -- (这里不知道为啥就突然想不起来了)回答了是对方法加锁(错误),实际上是对实例对象进行加锁。如果是对静态方法加锁,则锁住的是类 .class。 - -#### 如果现在要一个线程安全的 List,你会如何实现? - -- (想到了 CopyOnWriteArrayList)使用写时复制技术,也就是在读取的时候不会加锁,并且在读时写的时候也不会加锁,而是通过对原有数据复制一份进行修改,最后再覆盖原来的数据。 - -> 感觉面试官不太理解我说的话,头面向一边开始思考,然后说我记得 CopyOnWriteArrayList 写的时候会加锁的吧。(CopyOnWriteArrayList 在写和写之间会添加锁) - -#### 谈一下你对内部类的理解? - -- (只想到了单例模式的静态内部类实现方法)单例模式的一种实现方式就是静态内部类,在静态内部类里面对单例类实例化,则在单例类被装载的时候并不会实例化静态内部类,只有在外部调用的时候才会进行实例化。 -- 普通的内部类我觉得是体现了封装关系吧。(开始胡扯) - -#### 项目当中遇到的困难? - -- 在秒杀的整体流程中考虑如何保证不会出现超卖和保证服务器正常运作,因此通过视频学习,实现了通过 Redis 给用户占位,Semaphore 模拟库存扣减,消息队列进行削峰减少服务器压力。通过 CompletableFuture 实现了 SKU 的异步查询,提高了接口的访问速度。 -- 另外在后期的优化中,通过对 JVM 的学习,调整了堆内存的分布,提高了 QPS。 - -#### 算法题:归并两个有序的数组 nums1,nums2,假设 nums1 有足够的空间 - -- 如果创建新的链表将另外两个链表归并能直接秒。在不创建额外的数组的条件下,代码写了一会,发现得不到想要的结果。面试完之后在本地 IDE 上调试了一下,发现有个点没考虑到。(真他妈蠢啊) -- **你的解题思路是什么?** -- 将 nums2 中的元素归并到 nums1 中,如果要插入 nums1 的 idx1 位置,则需要将这个位置以及后面的元素都向后移动移动一个位置。 -- **时间复杂度为多少?** -- 如果两个数组的长度都看成 n,则时间复杂度为 n 平方,因为外层是对数组遍历,内层是移动元素。 -- **时间复杂度的定义是啥?** -- 找到程序中平均运行次数最多的语句,计算他的运行次数,并得到相应的数量级就是时间复杂度。 - -## 税友集团 - -### 一面 - -全程八股,只记得一部分了。 - -- 介绍下电商项目 -- 秒杀部分的线程安全问题 -- Redis 在项目中的作用 -- 编写代码应该遵循的规范 -- 介绍一下Collection接口 -- HashMap线程安全吗?ConcurrentHashMap实现原理是什么? -- CAS是什么? -- 单例模式的实现方式 -- 静态内部类实现单例的原理 -- volatile关键字的作用,如何实现可见性的? -- synchronized关键字的作用,修饰类,类对象,静态方法的区别? -- ReentrantLock的实现原理,与synchronized的异同,公平和非公平如何实现的? -- 什么是Java内存模型?什么是原子性,可见性,有序性? -- happens-before是什么? -- ThreadLocal内部实现原理 -- 线程池的主要参数,任务队列有哪些? - -## 同程旅行 - - -### 一面 - -面试官迟到了一分钟还说抱歉,我真的哭死。 - -#### 介绍一下简历上的项目 - -- 第一个项目为一个电商的项目,通过 Nginx 动静分离,分为多个微服务。。。。。。 - -#### 介绍一下 IOC 和 AOP - -- IOC 又叫做控制翻转,在没有使用 Spring 之前,写后端的接口需要通过编写 Servlet 类来完成,有了控制反转之后,就能将这些对象的创建过程交给 Spring 来做,这样程序员就能注重于代码开发而不是对象创建。 -- AOP 是 SpringBoot 中的很重要的特性,面向切面编程,设计模式中讲到开闭原则,应该不修改原有的代码下扩展业务逻辑,Spring 可以在不修改原有代码的情况下实现对方法的前后的增强。主要使用到生成动态代理来进行增强,以 Spring 事务举例,通过生成一个 CGLIB 对象来获取数据库连接,将提交模式改为手动,之后执行数据库操作,发生异常则进行回滚,否则提交。 -- 了解的就这些了,可能还有一部分没有讲到。 -- **没关系已经答得很好了**。 - -#### SpringBoot 约定优于配置是什么意思? - -- 就是 SpringBoot 中有默认的配置,程序员不去配置就会使用这些默认的配置,用意在于帮程序员聚焦于业务逻辑上。 -- 例如不对 SpringBoot 的后端服务器进行配置,则会默认使用 Tomcat 作为后端服务器。 - -#### Spring 中的事务传播行为有哪些? - -- 传播行为的配置为事务注解里的 propagation 属性。 -- REQUIRED(默认):如果当前没有事务则开启一个新的事务,如果存在事务则加入。 -- SUPPORTS:如果存在事务则加入,否则以非事务模式运行。 -- MANDATORY:如果存在事务则加入,如果不存在事务则抛出异常。 -- NEVER:从来不使用事务。 -- NESTED:如果存在事务则将当前事务嵌套进去,否则开启一个新的事务。 - -#### Java 中有哪些类型的锁? - -- 是锁的分类还是具体的锁? -- **锁的分类。** -- 读锁,写锁,互斥锁,同步锁。(重入锁,读写锁,公平锁,互斥锁,信号量,偏向锁) - -#### 死锁发生的原因?怎么防止? - -- 操作系统中讲到死锁是因为两个或者以上的进程因为竞争资源导致停顿,如果没有外力作用则都无法向前推进。 -- 死锁产生有四个必要条件:互斥、不剥夺、请求并保持、环路等待。 -- 预防采取破坏第三个条件或者第四个,分别采取资源静态分配和资源有序分配方法。 -- 避免死锁采用银行家算法,死锁检测和解除用到死锁定理,资源分配图,发生死锁之后进行进程回退,进程撤销等。 - -#### 内存泄漏的理解 - -- JVM 中有四种引用类型,分别是强软弱虚,其中强引用不会被 GC,而软引用和弱引用会被 GC。 -- 例如 ThreadLocal 中包含一个内部类 ThreadLocalMap,是一个 Map,放入元素的 key 是弱引用而 value 是强引用,所以 key 可能会被 GC,则会导致 value 也取不到,内存泄漏。 -- **生产中如何排查?比如我提一点,及时释放动态分配的内存** -- 还是不知道怎么回答。 - -#### SQL 语句中关键字的优先级顺序 - -- 我尝试回答一下不一定对,from-》where-》group by-》having-》order by-》limit。(应该没错) - -#### 如何排查 SQL 是不是一个慢查询? - -- 生产阶段通过在 SQL 前添加 EXPLAIN 关键字,查看 SQL 的运行日志。 -- 例如字段 type 就能看出这个是哪种类型的操作,其中最好的是 system 类型,然后到 const,最差的是 all 表示全盘扫描。 -- 通过 key 可以查看 SQL 是不是走了索引。 - -#### 索引失效问题? - -- 最左匹配原则。 -- 查询中使用了函数计算。 -- or 关键字两端有一个没有走索引。 -- 隐式转换。 - -#### 如何对 MySQL 的性能进行调优? - -- 将经常查询或者不怎么变化的数据放入到 Redis 中。 -- 建立索引加快查询速度。 -- 分库分表。 -- **分库分表应该怎么做?** -- 我在项目中的表数据并不是很多所以没有做分表,但是做了分库,由于整个项目是微服务构建的,所以每一个微服务有各自的职责,根据数据自治原则,例如订单的微服务就应该管理其对应的订单库,产品微服务应该管理对应的产品库。 - -#### Redis 能用在什么场景上? - -- Redis 运行在内存上,所以对并发或者响应要求较高的场景都能用到。 -- 例如在本项目中,将不怎么变化的 SKU 商品数据放入 Redis 中,另外用户登录之后将用户数据放入到 Redis 中以实现多模块的用户数据共享。 -- 此外 Redis 还可以用作分布式锁解决缓存击穿问题。 - -#### Redis 的持久化方式 - -- RDB 是对内存做快照,有两种创建快照的方法,save 使用主线程进行持久化,bgsave 是创建一个新的线程进行持久化,创建 RDB 占用 CPU 和 IO 资源,数据实时性不是很好,但是 Redis 宕机之后恢复的速度很快。 -- AOF 是追加文件的方式,类似于 InnoDB 的 binlog,将数据的操作采用追加的方式记录,整体过程很快,但是当 AOF 文件较大的时候会产生重写,也会占用较多的资源,这种方式的实时性好,但是 Redis 宕机之后恢复的速度较慢。 - -#### 热 key 问题的解决方案 - -- Redis 中存在缓存穿透,缓存雪崩,缓存击穿,其中热 key 问题就是缓存击穿。 -- 以项目中的秒杀场景举例,每一个秒杀场次都有对应的时间段,在时间段内才能进行秒杀请求,所以保证热 key 在该秒杀场景下不要过期就能解决热 key 问题,另外如果热 key 意外过期,可以在对数据库请求前添加互斥锁来解决缓存击穿问题。 - -#### BIO 和 NIO - -- 按照分类来说 BIO 是阻塞 IO,CPU 在发送请求之后会一直等待 IO 数据准备好。不能做其他的事情。 -- NIO 是非阻塞 IO,请求发送之后就能立即返回,等到数据准备好了,通知 CPU 来做后续的事情。 -- Java 中的 NIO 可以看成一种多路复用的模型,IO 请求发送之后就能做其他事情,等到数据准备好了再进行后续。 -- **使用 BIO 的中间件有哪些?** -- Redis 中通过单线程处理多个请求,属于 IO 多路复用,Redis 中通过建立在 TCP 链接上的信道传输数据,另外 Tomcat 监听一个端口同事处理多个请求所以也是 NIO。 - -#### 用户的越权如何解决? - -- 越权指的是? -- **例如没登录的用户来请求需要登录的接口。** -- 商城项目中对用户的账号密码验证之后会将用户的数据放入 Redis 中,并返回 token 给前端,前端的请求会被过滤器拦截,如果携带了正确的 token 则能直接取出用户数据得到用户的权限。 - -#### 如果有个接口性能比较差如何做优化? - -- 接口优化在本项目中的体现:通过 zipkin 链路追踪发现 SKU 商品信息的查询花费时间较长,因为商品包含很多数据,需要去多个表中查询,因此采用异步编排将多个请求交给线程池执行,通过并发提交接口响应速度。 -- 另外在秒杀场景中做压力测试,通过 Jconsole 发现老年代的 GC 频率较高,通过 JVM 参数 NewRatio 提高了老年代的比率,使得秒杀的吞吐量提高了。 - -#### 反问 - -### 二面 - -面试官看起来像个大佬。没有太多八股问题,20 分钟结束。 - -#### 登录部分怎么做的? - -#### Redis 提高并发指的是? - -#### 分布式锁怎么做的,有了解原理吗? - -#### 每个用户查询自己的订单数据如何做数据隔离的? - -#### RabbitMQ 削峰填谷说一下 - -#### 如果后端并发量承受不了如何做优化? - -#### 反问 - diff --git a/src/note/1aboutprojects.md b/src/note/aother/0aboutprojects.md similarity index 100% rename from src/note/1aboutprojects.md rename to src/note/aother/0aboutprojects.md diff --git a/src/note/2hadoop.md b/src/note/aother/1hadoop.md similarity index 100% rename from src/note/2hadoop.md rename to src/note/aother/1hadoop.md diff --git a/src/note/aother/README.md b/src/note/aother/README.md new file mode 100644 index 0000000000..4b8b64287a --- /dev/null +++ b/src/note/aother/README.md @@ -0,0 +1,12 @@ +--- +title: 闲记 +icon: xianji +index: false +cover: /home/202305122sdf05406.jpg +pageInfo: false +article: false +timeline: false +--- +
+ +
diff --git a/src/note/binterview/README.md b/src/note/binterview/README.md new file mode 100644 index 0000000000..c53094a55b --- /dev/null +++ b/src/note/binterview/README.md @@ -0,0 +1,12 @@ +--- +title: 面经 +icon: interview +index: false +cover: /home/202305122sdf05406.jpg +pageInfo: false +article: false +timeline: false +--- +
+ +
diff --git a/src/note/binterview/dewu.md b/src/note/binterview/dewu.md new file mode 100644 index 0000000000..f4987fcf2b --- /dev/null +++ b/src/note/binterview/dewu.md @@ -0,0 +1,73 @@ +--- +title: 得物-Java开发-一二面 +icon: duihua +date: 2023-09-02 +star: true +category: + - 面经 +tag: + - 得物 + - 面经 +--- + +⁉️ 个人回答不保证正确 + +## 一面 + +### 说一说 CMS 和 G1 垃圾收集器 + +- CMS 是标记清除算法的垃圾回收器,运行流程分为初始标记、并发标记、重新标记、并发清除,其中初始标记和重新标记会产生 STW,对在并发标记阶段修改的引用采用增量更新方法,G1 将堆内存分为多个 Region 区域,可以作为年轻代或者老年代,运行流程分为初始标记、并发标记、最终标记、筛选回收,其中除了并发标记阶段都会产生 STW,对并发标记阶段产生的引用链修改采用原始快照的方法。 + +### ReentrantLock 中的公平锁和非公平锁是怎么实现的? +- ReentrantLock 基于 AQS 实现,其中有公平锁实现和非公平锁实现,对对象的加锁过程就是修改对象的 state 过程,采用 CAS 进行修改,修改失败表示有竞争,则会创建为一个 CLH 节点放入到 CLH队列的尾部,CLH 队列是一个虚拟的双向队列,其中存储了线程关系,存放在这个队列中的节点都是为竞争锁失败的节点。 +- 公平锁实现:如果锁被释放,则会唤醒 CLH 队列中头节点的后一个节点,来竞争加锁,此时如果有一个新的线程也想进行加锁,则会检查 CLH 队列中头节点之后是否有节点,有节点则表示之前已经有线程等待了,则将自己放入 CLH 队列尾部。 +- 非公平锁实现:在有新线程想加锁时,不管 CLH 队列中头节点之后是否有节点在等待,直接使用 CAS 尝试加锁。 + +### redo log 和 undo log 的作用? +- redo log 用来记录数据库的修改,主要用来做崩溃恢复的,undo log 配合隐藏字段、Read View 实现 MVCC。 +- **redo log 文件是啥样的?**(没太懂啥意思) +- redo log 在磁盘中以日志文件组的形式出现,可以看成一个循环队列,包含 checkpoint 和 write pos,如果 write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log 记录。 +- **redo log 是顺序写吗?** +- 是顺序写,如果对每次修改之后将一个页写回,可能只修改了很少的数据,没有必要这样做,并且页还不是顺序写效率较差,如果是 redo log 写,又是顺序写,整体效率较高。 + +### 两阶段提交了解吗? +- 两阶段提交指的是 redo log 的提交分为两个阶段,分别是 prepare 和 commit,在 prepare 之后 binlog 写入,然后再 commit。 +- 如果在 prepare 之后,出现问题,导致 binlog 写入失败,则发现没有对应的 binlog,事务将会回滚,如果是在写 binlog 之后发生错误,即使 redo log 没有 commit,但是有 binlog 则表明事务提交成功了,事务不会回滚。 + +### Spring 事务说说 +- Spring 中事务通过 @Transactional 注解对方法提供事务支持,原理是创建一个动态代理对象,由动态代理对象执行这个方法,并对前后进行增强,也就是在执行数据库操作前将事务的提交模式改为手动,再进行数据库操作,发生异常则进行回滚。 + +### 什么情况下会产生事务失效? + +- 方法没有被 public 修饰,因为 CGLIB 动态代理是生成一个子类进行调用,如果父类方法不是 public 则调用不了。 +- this 调用,需要使用动态代理对象调用方法才能让事务失效,this 调用是普通对象的调用。 +- 异常没有正确抛出,如果内部将异常捕获了,外部 Spring 感知不到则会导致事务失效。 +- 事务的传播机制设置错误,例如设置为 NEVER 则表示不使用事务。 +- 数据库本身不支持事务。 + +### 什么情况下使用编程式事务什么情况下使用注解式事务? + +- (不太明白,我直接说没有用过编程式事务) +- 编程式事务能在任何的代码片段中添加事物,而注解式事务的要求条件比较多,灵活性不如编程式事务。 +- 注解式事务会导致方法开始的时候就申请连接,可能导致连接的利用率不高,不如编程式事务。 + +### SSL/TSL 了解吗? +- (不了解)不太了解,只知道 HTTPS 是基于 SSL/TSL 实现的,这两个都是建立在 TCP 链接基础上的协议。 +- HTTPS 为了防止中间人篡改信息,引入了证书机制,证书就是身份信息 + 公钥,将公钥发送给客户端,客户端通过上层证书提供商检查证书合法性,通过之后则会产生一个秘钥,秘钥通过公钥进行加密,到了服务器端通过私钥进行解密。服务器得到秘钥,之后的数据传输用这个秘钥进行对称加密。 +- 总结就是发送的数据通过对称加密,加密使用的秘钥通过非对称加密。 + +### 国内输入谷歌网站但是访问不到,发生了什么? +- 正常访问网页首先是通过域名 DNS 解析得到 IP 地址,查询方式有迭代查询和递归查询。之后与服务器建立 TCP 连接,然后发送请求到服务器,服务器返回数据,浏览器渲染。 +- **访问不到 Google 的原因是在哪个环节?** +- 我先说是 DNS,后来想了下回答是 TCP 连接环节。 +- **防火墙在哪一个环节生效?** +- TCP 连接环节,因为 TCP 是端到端的协议,需要提供端口,配置防火墙的时候需要添加入站和出站的端口。 + +### 反问 + +## 二面 + +### 学习中遇到困难如何解决的?请举例。 + +- 举了 float 浮点数的精度丢失问题,如何解决。线程安全问题,例如对 int 变量的并发修改问题,如何解决,volatile 关键字的实现原理,再延伸到 JVM 内存模型。 +- 几乎没有太多技术性的问题。 diff --git a/src/note/binterview/futu.md b/src/note/binterview/futu.md new file mode 100644 index 0000000000..22aab782c6 --- /dev/null +++ b/src/note/binterview/futu.md @@ -0,0 +1,100 @@ +--- +title: 富途-测试开发-一二面 +icon: duihua +star: true +category: + - 面经 +tag: + - 富途 + - 面经 +--- + +⁉️ 个人回答不保证正确 + +## 一面 + +### 自我介绍 + +### 谈谈你对测试流程的理解 + +- 最近才开始学测试,整体流程不是太了解,我认为是编写好文档,然后设计好输入的样例,查看输出结果是否能对应上。 + +### 为什么想投递测试? +- 因为 Java 开发竞争太大了,而且会后端代码,能更好的做白盒测试。 +- **其实竞争都挺大,哈哈。** + +### 对数据库的查询,数据进行排序获取前十个用什么关键字? +- 使用 order by 和 limit。 +- **如果进行分组呢?** +- group by。 + +### 发现数据库查询的速度变慢,会想到什么优化措施? + +- 尽量减少 select * 的查询,如果数据库的数据太多,可以使用分库分表,经常查询的字段可以添加索引。 + +### 数据库死锁了解吗? + +- 操作系统中定义的死锁为有两个或者多个进程因为竞争资源导致阻塞,如果没有外力作用,两者都无法向前推进。 +- 数据库中的死锁发生在两个事务对数据加锁并且请求修改对方加锁的数据。 +- +### 常见的 HTTP 状态码说下 + +- 200 请求成功,301 永久重定向,302 临时重定向,400 客户端错误,401 未授权,403 访问拒绝,404 页面没有找到,500 服务器错误,502 网关错误,504 网关超时。 + +### GET 和 POST 区别 + +- GET 用来请求数据,POST 用来插入数据。 +- GET 幂等,POST 不幂等。 +- GET 的参数放在 URL 中,POST 放在 Body 中。 +- 这些都是规范,也可以不遵守,将后端的处理做好即可。 + +### TCP 和 UDP 的区别 + +- TCP 面向连接,字节流,可靠的传输层协议。 +- UDP 不面向连接,不可靠的传输层协议。 +- TCP 是端到端的协议,双方需要通过三次握手建立连接。 +- UDP 可以产生广播消息,TCP 不可以。 +- **UDP 适用于哪些场景?** +- 视频对话,语音对话,对正确性要求不高的场景。 +- TCP 适用于对要求高的场景,例如 FTP、POP3、SMTP、SSH 协议等都是基于 TCP 的。 +- **那么我在腾讯视频看视频的时候应该用的是哪种传输协议?** +- 应该是 TCP 吧,看视频其实就是文件传输的过程,使用 FTP 将文件传输到本地,然后通过播放器播放,对文件的完整性要求高。 + +### 如果有八个球,其中七个球的重量是相同的,另外一个球稍微重一点,给你一个天平,需要多少次比较能得到最重的球? + +- 刚开始想到的是二分查找,首先 4V4,然后 2V2,再 1V1。 +- **不对,还可以做优化。** +- 能给点提示吗? +- **例如三个球,当中有一个重一点,则需要几次比较?** +- 一次,选择两个球,如果当中有一个重,则就是目标球,如果两个重量相等剩下的就是目标球。 +- 所以八个球的场景下,应该先 3V3,如果有一边重,则退化为三个球的场景,如果同样重,则最重的球在剩余两个球中,需要一次比较。 + +### 有一根绳子,从一边开始烧,烧完需要一个小时,则如何通过烧绳子计时 1 小时 15 分钟? +- 首先用两根绳子,当中一个从两边开始烧,需要半个小时烧完,另外一个先从一边开始烧,到了半个小时之后将另外一边点燃,则再过 15 分钟烧完。 +- 剩余一个小时再烧一根绳子即可。 + +### 代码题爬楼梯 + +- 动态规划 + +### 有 n 个人,他们各自有一个礼物,送给其他人,并且不能拿到自己的礼物,打印所有情况 + +- (回溯光速写完,以为秒了)。 +- **有个 BUG 你发现了吗?例如有五个人,前四个只拿到了前四个人的礼物,则最后一个人只剩下自己的礼物怎么办?** +- 跟前面任意一个人交换礼物即可。 + +### 代码题,找出无序数组中的最大值和最小值 + +- 线性查找 + +### 反问 + +## 二面 + +### HashMap底层结构 + +### 从 1 ~ N 的数字中随机取出 M 个 数字,时间复杂度要求为 M + +### 52 张扑克牌中,取出炸弹的概率大还是顺子的概率大? + +### 有 10 个袋子,每个袋子里面都有 100 个硬币,其中 9 个袋子中的硬币重量是相同的,都是 10 克,另外一个袋子里的硬币是 9 克,如果只用一次带刻度的电子秤,找到 9 克硬币的袋子的方法 diff --git a/src/note/binterview/kuaishouone.md b/src/note/binterview/kuaishouone.md new file mode 100644 index 0000000000..3bf9499b57 --- /dev/null +++ b/src/note/binterview/kuaishouone.md @@ -0,0 +1,157 @@ +--- +title: 快手-客户端开发-一二面 +icon: duihua +date: 2023-08-08 +star: true +category: + - 面经 +tag: + - 快手 + - 面经 +--- + +⁉️ 个人回答不保证正确 + +## 一面 + +### 自我介绍 + +### 对电商项目的优化 + +- 更改了 JVM 中的老年代和新生代的内存分布,将秒杀的并发量提高。 +- 使用 CompletableFuture 对 SKU 数据进行异步查询,提高了查询速度。 +- 登录部分由原来的手动查询用户数据密码比对,改为了使用 SpringSecurity 进行登录认证,简化了开发步骤,另外使用 Redis 解决分布式下的用户数据共享。 +- 使用 Sentinel 限制后端并发数,熔断降级保证服务安全可用。 + +### 虚拟内存的概念 + +- 虚拟内存是解决内存紧张的问题,对应于操作系统调度中的中级调度,在程序运行时并不要把所有的数据都放入内存,并且在内存紧张时将部分暂时不会执行的进程放入到磁盘中,等到内存够用时再将其调回内存。 + +### 操作系统中文件的实现 + +- 单级目录结构和多级目录结构以及图形目录结构的优缺点。 + +> 现在想起来面试官问的应该是文件的逻辑结构和物理结构。 +> +> 逻辑结构分为顺序,索引和顺序索引结构。 +> +> 物理结构的实现分为 +> +> - 连续分配,在目录中设置对应文件的开始块号和结束块号。 +> +> - 链接分配分为隐式链接和显式链接,隐式链接可靠性差,显示连接的指针占用空间,并且可靠性也不好。 +> - 索引分配,为每个文件分配一个索引分配表,表中记录了属于这个文件的磁盘块,不仅支持随机访问,而且不会产生外部碎片。 +> - 混合索引分配,既有直接地址分配,又有多级索引分配。 + +### 多级缓存的作用 + +- (这玩意书上怎么没看到),我说我对硬件有所了解,CPU 中的缓存就是多级缓存,现在的 CPU 一般包含三级缓存,分别是 l1,l2,l3,速度逐渐降低,容量逐渐扩大,使用多级缓存能很好的解决 CPU 速度和主存速度不匹配的问题,就像主存用来解决 CPU 和 磁盘之间的速度差异一样。 + +### 访问一个网址的过程 + +- 首先通过 DNS 解析为 IP 地址,再和 IP 地址进行 TCP 三次握手,将请求发送给服务器,服务器处理之后返回解析的数据,浏览器展示。 + +### TCP 三次握手说说 + +- 首先客户端发送数据到客户端,当中有 `SYN=1,seq=x`,服务器收到数据之后返回确认 `SYN=1,ack=x+1,seq=y`,客户端收到确认之后返回确认`ack=y+1,seq=x+1`。 + +### HTTP 和 HTTPS 的区别 + +- **端口号**:HTTP 默认是 `80`,HTTPS 默认是 `443`。 + +- **URL 前缀**:HTTP 的 URL 前缀是 `http://`,HTTPS 的 URL 前缀是 `https://`。 + +- **安全性和资源消耗**:HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。 + +### 常见的 Request Header + +- `Accept`:请求报头域,用于指定客户端能接受哪些类型的信息。 +- `Host`:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的地址。 +- `Referer`:表示当前的请求是从哪个 URL 过来的,一般可以用来做反爬虫,不是本站发送的请求就不会响应。 +- `Connection`:分为 `close` 和 `keep-alive` 用来表示发送完请求的对象之后是关闭连接还是持续的连接。 +- `Access-Control-Allow-Origin`:允许跨域时添加的参数,用来表示哪个源地址发来的请求允许跨域。 +- `Cache-Control`:控制是否能缓存数据。 +- `Accept-Language`:浏览器支持的语言。 +- `Accept-Encoding`:浏览器支持的编码方案。 + +### 数据库为什么比 Redis 慢? + +- 数据库需要从磁盘中读取页来进行查询,而 Redis 是在内存中操作,所以速度更快,另外 Redis 使用多路复用技术使得并发量进一步提高。 + +### 如果一张表中有太多的列和太多的行,怎么进行优化? + +- 水平分表和垂直分表,将数据分散到多张表中以解决单表的并发度问题。 + +### 算法题 + +- 链表右移,右移的元素放入到头部 +- 例如 1->2->3->4,右移 1 次之后变成 4->1->2->3,求出右移 k 次之后的链表,秒了。 + +### 反问技术栈 + +## 二面 挂 + +> 面出阴影了。 + +### 介绍一下线程池 + +- 介绍了线程池参数,拒绝策略,常见的线程池实现,任务队列的类型等。 + +### 线程池的好处 + +- 减少了线程频繁创建销毁的开销。 +- 提高响应速度。 +- 提高线程的可管理性。 + +### 线程切换为什么比进程切换开销小? + +> 傻逼了,背了不知道多少遍线程切换开销小,怎么就没想过这个问题的答案呢。 + +进程是资源管理的基本单位,线程只拥有小部分提供自身运行的资源。进程在切换时会导致快表 TLB 失效(快表中存储了最近进程访问的页面映射,可以加快虚实地址转换速度),进程切换时要切页表,而且往往伴随着页调度,因为进程的数据段代码段要换出去,以便把将要执行的进程的内容换进来。而线程只需要保存上下文信息(状态寄存器和栈信息)。 + +### 在项目中如何通过场景的不同给定线程数目? + +- 在 CPU 繁忙的项目中,将核心线程数设置为 N + 1,N 为 CPU 核心数,多出来的 1 用来处理偶然发生的缺页中断。 +- IO 密集型设置核心线程数为 2N,系统大部分时间用来处理 IO 交互,处理 IO 的时候就不会占用 CPU 资源,这时可以将 CPU 交给其他任务。 + +> 面试管说在 IO 繁忙型的项目中,不应该设置这么多的核心线程,因为在 IO 的时候线程是会阻塞的,设置多个线程没有作用。 + +### 假如我是个小白,如何向我解释并发编程? + +- 我觉得 Java 的主要优势就是多线程的并发执行,在并发执行的过程中,如果不加以限制就会导致结果出现错误(并行语义之间不保证顺序性),因此并发编程就是学习在各种业务场景下保证线程安全,并学习 JDK 中的各种并发安全的类。 + +### 说说 Java 当中的锁 + +- 互斥锁和共享锁算分类吗? +- **算的,举个例子。** +- 例如同步锁 synchronized 关键字就是互斥锁,另外还有基于 AQS 实现的 ReentrantLock、CountDownLatch、CyclicBarrier。 +- **如果对实例方法加锁,锁住的是什么?** +- (这里不知道为啥就突然想不起来了)回答了是对方法加锁(错误),实际上是对实例对象进行加锁。如果是对静态方法加锁,则锁住的是类 .class。 + +### 如果现在要一个线程安全的 List,你会如何实现? + +- (想到了 CopyOnWriteArrayList)使用写时复制技术,也就是在读取的时候不会加锁,并且在读时写的时候也不会加锁,而是通过对原有数据复制一份进行修改,最后再覆盖原来的数据。 + +> 感觉面试官不太理解我说的话,头面向一边开始思考,然后说我记得 CopyOnWriteArrayList 写的时候会加锁的吧。(CopyOnWriteArrayList 在写和写之间会添加锁) + +### 谈一下你对内部类的理解? + +- (只想到了单例模式的静态内部类实现方法)单例模式的一种实现方式就是静态内部类,在静态内部类里面对单例类实例化,则在单例类被装载的时候并不会实例化静态内部类,只有在外部调用的时候才会进行实例化。 +- 普通的内部类我觉得是体现了封装关系吧。(开始胡扯) + +### 项目当中遇到的困难? + +- 在秒杀的整体流程中考虑如何保证不会出现超卖和保证服务器正常运作,因此通过视频学习,实现了通过 Redis 给用户占位,Semaphore 模拟库存扣减,消息队列进行削峰减少服务器压力。通过 CompletableFuture 实现了 SKU 的异步查询,提高了接口的访问速度。 +- 另外在后期的优化中,通过对 JVM 的学习,调整了堆内存的分布,提高了 QPS。 + +### 算法题:归并两个有序的数组 nums1,nums2,假设 nums1 有足够的空间 + +- 如果创建新的链表将另外两个链表归并能直接秒。在不创建额外的数组的条件下,代码写了一会,发现得不到想要的结果。面试完之后在本地 IDE 上调试了一下,发现有个点没考虑到。(真他妈蠢啊) +- **你的解题思路是什么?** +- 将 nums2 中的元素归并到 nums1 中,如果要插入 nums1 的 idx1 位置,则需要将这个位置以及后面的元素都向后移动移动一个位置。 +- **时间复杂度为多少?** +- 如果两个数组的长度都看成 n,则时间复杂度为 n 平方,因为外层是对数组遍历,内层是移动元素。 +- **时间复杂度的定义是啥?** +- 找到程序中平均运行次数最多的语句,计算他的运行次数,并得到相应的数量级就是时间复杂度。 + +### 反问技术栈(已经凉了,不知道问啥就跟一面问的相同) diff --git a/src/note/binterview/shuiyou.md b/src/note/binterview/shuiyou.md new file mode 100644 index 0000000000..ec4d2909ce --- /dev/null +++ b/src/note/binterview/shuiyou.md @@ -0,0 +1,32 @@ +--- +title: 税友集团-Java开发-一面 +icon: duihua +star: true +category: + - 面经 +tag: + - 税友集团 + - 面经 +--- + +## 一面 + +全程八股,只记得一部分了。 + +- 介绍下电商项目 +- 秒杀部分的线程安全问题 +- Redis 在项目中的作用 +- 编写代码应该遵循的规范 +- 介绍一下Collection接口 +- HashMap线程安全吗?ConcurrentHashMap实现原理是什么? +- CAS是什么? +- 单例模式的实现方式 +- 静态内部类实现单例的原理 +- volatile关键字的作用,如何实现可见性的? +- synchronized关键字的作用,修饰类,类对象,静态方法的区别? +- ReentrantLock的实现原理,与synchronized的异同,公平和非公平如何实现的? +- 什么是Java内存模型?什么是原子性,可见性,有序性? +- happens-before是什么? +- ThreadLocal内部实现原理 +- 线程池的主要参数,任务队列有哪些? +- diff --git a/src/note/binterview/tongcheng.md b/src/note/binterview/tongcheng.md new file mode 100644 index 0000000000..e2174dd3ec --- /dev/null +++ b/src/note/binterview/tongcheng.md @@ -0,0 +1,142 @@ +--- +title: 同程旅行-Java开发-一二面 +icon: duihua +date: 2023-09-27 +star: true +category: + - 面经 +tag: + - 同程 + - 面经 +--- + +⁉️ 个人回答不保证正确 + +## 一面 + +面试官迟到了一分钟还说抱歉,我真的哭死。 + +### 介绍一下简历上的项目 + +- 第一个项目为一个电商的项目,通过 Nginx 动静分离,分为多个微服务。。。。。。 + +### 介绍一下 IOC 和 AOP + +- IOC 又叫做控制翻转,在没有使用 Spring 之前,写后端的接口需要通过编写 Servlet 类来完成,有了控制反转之后,就能将这些对象的创建过程交给 Spring 来做,这样程序员就能注重于代码开发而不是对象创建。 +- AOP 是 SpringBoot 中的很重要的特性,面向切面编程,设计模式中讲到开闭原则,应该不修改原有的代码下扩展业务逻辑,Spring 可以在不修改原有代码的情况下实现对方法的前后的增强。主要使用到生成动态代理来进行增强,以 Spring 事务举例,通过生成一个 CGLIB 对象来获取数据库连接,将提交模式改为手动,之后执行数据库操作,发生异常则进行回滚,否则提交。 +- 了解的就这些了,可能还有一部分没有讲到。 +- **没关系已经答得很好了**。 + +### SpringBoot 约定优于配置是什么意思? + +- 就是 SpringBoot 中有默认的配置,程序员不去配置就会使用这些默认的配置,用意在于帮程序员聚焦于业务逻辑上。 +- 例如不对 SpringBoot 的后端服务器进行配置,则会默认使用 Tomcat 作为后端服务器。 + +### Spring 中的事务传播行为有哪些? + +- 传播行为的配置为事务注解里的 propagation 属性。 +- REQUIRED(默认):如果当前没有事务则开启一个新的事务,如果存在事务则加入。 +- SUPPORTS:如果存在事务则加入,否则以非事务模式运行。 +- MANDATORY:如果存在事务则加入,如果不存在事务则抛出异常。 +- NEVER:从来不使用事务。 +- NESTED:如果存在事务则将当前事务嵌套进去,否则开启一个新的事务。 + +### Java 中有哪些类型的锁? + +- 是锁的分类还是具体的锁? +- **锁的分类。** +- 读锁,写锁,互斥锁,同步锁。(重入锁,读写锁,公平锁,互斥锁,信号量,偏向锁) + +### 死锁发生的原因?怎么防止? + +- 操作系统中讲到死锁是因为两个或者以上的进程因为竞争资源导致停顿,如果没有外力作用则都无法向前推进。 +- 死锁产生有四个必要条件:互斥、不剥夺、请求并保持、环路等待。 +- 预防采取破坏第三个条件或者第四个,分别采取资源静态分配和资源有序分配方法。 +- 避免死锁采用银行家算法,死锁检测和解除用到死锁定理,资源分配图,发生死锁之后进行进程回退,进程撤销等。 + +### 内存泄漏的理解 + +- JVM 中有四种引用类型,分别是强软弱虚,其中强引用不会被 GC,而软引用和弱引用会被 GC。 +- 例如 ThreadLocal 中包含一个内部类 ThreadLocalMap,是一个 Map,放入元素的 key 是弱引用而 value 是强引用,所以 key 可能会被 GC,则会导致 value 也取不到,内存泄漏。 +- **生产中如何排查?比如我提一点,及时释放动态分配的内存** +- 还是不知道怎么回答。 + +### SQL 语句中关键字的优先级顺序 + +- 我尝试回答一下不一定对,from-》where-》group by-》having-》order by-》limit。(应该没错) + +### 如何排查 SQL 是不是一个慢查询? + +- 生产阶段通过在 SQL 前添加 EXPLAIN 关键字,查看 SQL 的运行日志。 +- 例如字段 type 就能看出这个是哪种类型的操作,其中最好的是 system 类型,然后到 const,最差的是 all 表示全盘扫描。 +- 通过 key 可以查看 SQL 是不是走了索引。 + +### 索引失效问题? + +- 最左匹配原则。 +- 查询中使用了函数计算。 +- or 关键字两端有一个没有走索引。 +- 隐式转换。 + +### 如何对 MySQL 的性能进行调优? + +- 将经常查询或者不怎么变化的数据放入到 Redis 中。 +- 建立索引加快查询速度。 +- 分库分表。 +- **分库分表应该怎么做?** +- 我在项目中的表数据并不是很多所以没有做分表,但是做了分库,由于整个项目是微服务构建的,所以每一个微服务有各自的职责,根据数据自治原则,例如订单的微服务就应该管理其对应的订单库,产品微服务应该管理对应的产品库。 + +### Redis 能用在什么场景上? + +- Redis 运行在内存上,所以对并发或者响应要求较高的场景都能用到。 +- 例如在本项目中,将不怎么变化的 SKU 商品数据放入 Redis 中,另外用户登录之后将用户数据放入到 Redis 中以实现多模块的用户数据共享。 +- 此外 Redis 还可以用作分布式锁解决缓存击穿问题。 + +### Redis 的持久化方式 + +- RDB 是对内存做快照,有两种创建快照的方法,save 使用主线程进行持久化,bgsave 是创建一个新的线程进行持久化,创建 RDB 占用 CPU 和 IO 资源,数据实时性不是很好,但是 Redis 宕机之后恢复的速度很快。 +- AOF 是追加文件的方式,类似于 InnoDB 的 binlog,将数据的操作采用追加的方式记录,整体过程很快,但是当 AOF 文件较大的时候会产生重写,也会占用较多的资源,这种方式的实时性好,但是 Redis 宕机之后恢复的速度较慢。 + +### 热 key 问题的解决方案 + +- Redis 中存在缓存穿透,缓存雪崩,缓存击穿,其中热 key 问题就是缓存击穿。 +- 以项目中的秒杀场景举例,每一个秒杀场次都有对应的时间段,在时间段内才能进行秒杀请求,所以保证热 key 在该秒杀场景下不要过期就能解决热 key 问题,另外如果热 key 意外过期,可以在对数据库请求前添加互斥锁来解决缓存击穿问题。 + +### BIO 和 NIO + +- 按照分类来说 BIO 是阻塞 IO,CPU 在发送请求之后会一直等待 IO 数据准备好。不能做其他的事情。 +- NIO 是非阻塞 IO,请求发送之后就能立即返回,等到数据准备好了,通知 CPU 来做后续的事情。 +- Java 中的 NIO 可以看成一种多路复用的模型,IO 请求发送之后就能做其他事情,等到数据准备好了再进行后续。 +- **使用 BIO 的中间件有哪些?** +- Redis 中通过单线程处理多个请求,属于 IO 多路复用,Redis 中通过建立在 TCP 链接上的信道传输数据,另外 Tomcat 监听一个端口同事处理多个请求所以也是 NIO。 + +### 用户的越权如何解决? + +- 越权指的是? +- **例如没登录的用户来请求需要登录的接口。** +- 商城项目中对用户的账号密码验证之后会将用户的数据放入 Redis 中,并返回 token 给前端,前端的请求会被过滤器拦截,如果携带了正确的 token 则能直接取出用户数据得到用户的权限。 + +### 如果有个接口性能比较差如何做优化? + +- 接口优化在本项目中的体现:通过 zipkin 链路追踪发现 SKU 商品信息的查询花费时间较长,因为商品包含很多数据,需要去多个表中查询,因此采用异步编排将多个请求交给线程池执行,通过并发提交接口响应速度。 +- 另外在秒杀场景中做压力测试,通过 Jconsole 发现老年代的 GC 频率较高,通过 JVM 参数 NewRatio 提高了老年代的比率,使得秒杀的吞吐量提高了。 + +### 反问 + +## 二面 + +面试官看起来像个大佬。没有太多八股问题,20 分钟结束。 + +### 登录部分怎么做的? + +### Redis 提高并发指的是? + +### 分布式锁怎么做的,有了解原理吗? + +### 每个用户查询自己的订单数据如何做数据隔离的? + +### RabbitMQ 削峰填谷说一下 + +### 如果后端并发量承受不了如何做优化? + +### 反问 diff --git "a/src/note/cphoto/992023.4\345\271\263\346\275\255.md" "b/src/note/cphoto/992023.4\345\271\263\346\275\255.md" new file mode 100644 index 0000000000..8e5b92bd73 --- /dev/null +++ "b/src/note/cphoto/992023.4\345\271\263\346\275\255.md" @@ -0,0 +1,48 @@ +--- +title: 2023.4-平潭 +date: 2023-04-15 +icon: picture +category: + - 拍拍 +tag: + - 平潭 + - 旅拍 +star: true +--- +### 2023.4平潭-世间浪漫海占一半 +![image.png](/markdown/20230528193150.jpg) +今年四月又来看海了 + +![20230528193723](/markdown/20230528193723.jpg) + +![20230528193912](/markdown/20230528193912.jpg) + +![20230528194238](/markdown/20230528194238.jpg) + +⭐猴研岛,68海里景区 + +![20230528193809](/markdown/20230528193809.jpg) +⭐去北线的路上 + +![20230528193851](/markdown/20230528193851.jpg) + +⭐环岛路旁 + +![20230528194354](/markdown/20230528194354.jpg) + +⭐长江澳风车田 + +![20230528194112](/markdown/20230528194112.jpg) + +![20230528194206](/markdown/20230528194206.jpg) + +![20230528194438](/markdown/20230528194438.jpg) + +⭐北部湾生态长廊 + +![20230528194640](/markdown/20230528194640.jpg) + +![20230528194630](/markdown/20230528194630.jpg) + +⭐龙凤头浪花 + diff --git a/src/note/cphoto/README.md b/src/note/cphoto/README.md new file mode 100644 index 0000000000..2c5517bafe --- /dev/null +++ b/src/note/cphoto/README.md @@ -0,0 +1,12 @@ +--- +title: 拍拍 +icon: photo +index: false +cover: /home/202305122sdf05406.jpg +pageInfo: false +article: false +timeline: false +--- +
+ +