【大厂面试】之 美团(一面经含答案)

美团

一面

  1. tcp三次握手,四次挥手。time-wait、close-wait状态。MSL代表什么?为什么time-wait是2MSL,可不可以更长?如果不设置time-wait有什么影响

    • time-wait是主动关闭方的一个状态;close-wait是被动关闭方的一个状态。
    • a FIN b(第一次挥手),b ACK a(第二次挥手,此时主动关闭方->被动关闭方连接断开),同时b向上层应用报备关闭连接,上层应用准备好后,b进入close-wait状态,此时 b FIN a(第三次挥手),a接收到FIN后进入time-wait状态,但a无法确定自己接下来的ack是否被b收到,所以time_wait还是会持续2MSL。下来会有两种情况:
      • b接收a发送的ACK(第四次挥手,被动方->主动方连接断开)
      • b没有接收到ACK,此时b在此发送FIN给a,a接收到后重新方ACK
    • MSL(Maximum Segment Lifetime,最长报文段寿命)是指任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃。1MSL=2min
    • time-wait是2MSL主要是为了保证客户端发送的最后一个ACK能够到达服务器。是2MSL的原因是服务器发客户端一个FIN需要等MSL,客户端在发给服务器一个ACK也需要一个MSL,一共需要2个MSL。更长不利于网络的传输,因为开启通道会占用服务器的资源,如线程会进入阻塞。
    • 不设置time-wait,若客户端最后一个ACK丢失,此时服务器到客户端之间的连接无法断开。
  2. TCP如何保证可靠性传输?ARQ重传什么时候会重传?超时计时器时间如何设置?(其实就是问拥塞控制)?TCP如何进行快速重传

    • 三次握手、四次挥手、分包编号、校验和、去重、流控、拥塞控制、ARQ重传。
    • 当发送发发出一个数据包时,超时计时器开始计时,若到0,还没有收到接收端发来的ACK会重传。
    • 超时计时器时间是根据发端和收端的情况(如距离)动态变化的。
    • 拥塞控制:当网络状态不好时,减少数据的发送。拥塞控制其实就是TCP丢包的情况。即由接收窗口来控制发送窗口的传输效率。拥塞控制算法有:慢开始、拥塞避免、快速重传与恢复。
      • 慢开始:慢开始的思想是一开始不知道网络的状况,不能一下子发送大量数据包到网络,可能会引起网络阻塞。慢开始是由小到大逐渐增大发送窗口,也就是从小到大增加拥塞窗口的数值。cwnd初值为1,每经过一轮,cwnd加倍。
      • 拥塞避免:让拥塞窗口缓慢增大,每经过一个往返时间RTT(即数据发送时刻到接收到确认的时刻的差值),就把发送放的cwnd加1
      • 快速重传与恢复(FRR):在TCP/IP协议中,FRR是拥塞控制算法,能够快速恢复丢失的数据包。若没有FRR,数据包丢失了,TCP只能根据超时定时器来进行重传。若有FRR,如果接收方接收到一个不按顺序的数据段,它会立即给发送方发送一个重复确认。如果发送方接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。当有单独的数据包丢失时,FRR能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
  3. HTTP为什么是无状态协议?Cookie和Session?Session保存在哪里?Session共享?

  4. 如何判断对象是否死亡?引用计数器有什么缺点?可达性分析算法能否解决A引用B,B引用A的情况(循环引用)?什么适合做GC Roots?

    • 使用引用计数器,若出现A引用B,B引用A的情景,A、B对象永远不会被回收。

    • 使用可达性分析算法,若出现A引用B,B引用A的情景,C是可达的,此时AB间存在关系,但是是不可达的。可以回收

    • 适合做GC Roots的对象(两栈两方法)

      • 虚拟机栈中引⽤的对象
      • 本地⽅法栈中引⽤的对象
      • ⽅法区中类静态变量引⽤的对象
      • ⽅法区中常量引⽤的对象
  5. 强引用、弱引用、软引用、虚引用?

  6. ThreadLocal?

  7. 线程的生命周期?(Block、Time waiting状态的区别)

    • NEW:新建状态。创建线程的方式:Thread类、Runnable接口、Callable接口、线程池
    • RUNABLE:运行状态。java线程的Runnable状态包含了就绪态Ready和运行态Running
    • WAITING:等待状态。由wait()和join()方法进入WAITING状态。需要由其它线程通知notify()来进入RUNABLE态
    • TIME-WAITING:超时等待态。由sleep(long)、wait(long)、join(long)进入,即设置了等待时间,不需要其它线程通知,时间到了后自动进入RUNABLE态
    • BLOCKED:阻塞状态。多线程执行同步方法,没有获取到锁的线程进入BLOCKED态,获取到了锁后进入RUNABLE态
    • TERMINATED:终止态。线程死亡
  8. 可重入锁和不可重入锁的区别?synchronized是可重入锁?一个线程是否可以重复获取一个锁?

    • 不可重入锁:同一个线程只能获取一次该资源的锁

      public class Lock{
           private boolean isLocked = false;
           public synchronized void lock() throws InterruptedException{
               //不可重入锁只用判断当前锁的状态,如果是true表示锁已被获取,就进入WAITING态
               while(isLocked){    
                   wait();
               }
               isLocked = true;
           }
          
          //不可重入锁解锁只用将标记设置为false,然后通知其它WAITING线程
           public synchronized void unlock(){
               isLocked = false;
               notify();
          }
      }
      
    • 可重入锁:同一个线程可以多次获取同一个资源的锁。可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

      public class Lock{
          boolean isLocked = false;
          Thread  lockedBy = null;
          int lockedCount = 0;
          public synchronized void lock()
                  throws InterruptedException{
              Thread thread = Thread.currentThread();
              //可重入锁还要判断当前申请锁的线程是否是拥有锁的线程,如果不是,进入WAITING态,保证该资源的互斥条件
              while(isLocked && lockedBy != thread){
                  wait();
              }
              //如果 获取锁的线程就是当前申请锁的线程,该线程在此获取该资源的锁,计数器++
              isLocked = true;
              lockedCount++;
              lockedBy = thread;
          }
          
          //可重入锁解锁:只有当前线程是拥有锁的线程,让锁计数器--,如果锁计数器为0表示锁没有被任何线程占有,将其状态更新并通知其它WAITING线程
          public synchronized void unlock(){
              if(Thread.currentThread() == this.lockedBy){
                  lockedCount--;
                  if(lockedCount == 0){
                      isLocked = false;
                      notify();
                  }
              }
          }
      }
      
    • 如调用A方法需要获取资源1的锁,A中调用B方法,B中也要获取资源1的锁。若是不可重入锁,会发生死锁;若是可重入锁,A、B方法是同一个线程调用,该线程获取重复获取资源1的锁,会判断申请该锁的线程是否是拥有该锁的线程,如果是,可以获取锁,LockCount++。可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

      public class Test{
           Lock lock = new Lock();
           public void methodA(){
               lock.lock();
               ...........;
               methodB();
               ...........;
               lock.unlock();
           }
           public void methodB(){
               lock.lock();
               ...........;
               lock.unlock();
           }
      }
      
    • synchronized是可重入锁(递归锁)。即synchronized方法递归调用不会发生死锁,说明其是可重入锁

      public class Main{
          public static void main(String[] args) throws CloneNotSupportedException {
              Main m = new Main();
              m.main1();
          }
      
          public synchronized void main1(){
              System.out.println("main1 exec...");
              main2();
          }
      
          private synchronized void main2() {
              System.out.println("main2 exec...");
              main3();
          }
      
          private synchronized void main3() {
              System.out.println("main3 exec...");
          }
      }
      
      //不会死锁,说明synchronized是可重入锁
      main1 exec...
      main2 exec...
      main3 exec...
      
  9. 悲观锁和乐观锁?CAS?ABA问题如何解决?

    • CAS(CompareAndSwap):A、V、B,A是旧值,V是地址,B是新值。只有A==B时,才会跳出死循环。
    • ABA:一个线程把数据A变成了B,然后又重新变成了A,此时另一个线程读取该数据的时候,发现A没有变化,就误认为是原来的那个A,但是此时A的一些属性或状态已经发生过变化。
    • 解决ABA用AtomicStampedReference类进行版本号控制。
  10. 线程池的7个参数?饱和策略?线程池原理?是否可以先创建线程再添加到工作队列中?

    • 线程池原理:

在这里插入图片描述

- 不可以先创建线程,再加入队列。这是因为创建线程所需资源比加入队列要大。从系统开销思考。
  1. 重量级锁是否一定比轻量级锁耗费资源?

    • 对于资源竞争较少(线程冲突较轻)的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态与内核态间的切换操作额外浪费消耗cpu资源;而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。
    • 对于资源竞争严重(线程冲突严重)的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized。
  2. MySQL索引的数据结构?b+索引的时间复杂度?

    • b+索引是通过二分查找的,它的时间复杂度是b+树的高度。
  3. 事务并发存在的问题?事务的隔离级别?

  4. 当前读和快照读的区别?MVCC是如何实现读已提交和可重复读的?

  5. 组合索引?select * from T where a = 1 and b < 10 and c = 2;走那些索引?

    • 为何要使用组合索引呢
      • 效率高,减少查询开销,索引列越多,通过索引筛选出的数据越少
      • 覆盖索引,MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操
    index(a,b,c)
    where a=3    只使用了a
    where a=3 and b=5    使用了a,b
    where a=3 and b=5 and c=4    使用了a,b,c
    where b=3 or where c=4    没有使用索引
    where a=3 and c=4    仅使用了a
    where a=3 and b>10 and c=7    使用了a,b。这是因为走a索引后,查出来的b是有序的,b也会走索引,而b是范围查找,查出来的c是无序的不走索引
    where a=3 and b like 'xx%' and c=7  使用了a,b
    
  6. 场景:在海量数据中如何精确匹配到某个值?

    • 布隆过滤器。bitmap
  7. 如何在1万个数据中找到最大的top999?

    - 堆排序,堆中元素只有100个,建小顶堆,堆顶元素最小,每来一个值与顶堆元素比较,如果比他小,那么肯定是top999里的。
    - 求最大topK建小顶堆,反之,求最小topK建大顶堆
    - 堆中元素个数为K
    - 如在1万个数据中找到最大的top999,从10000个数中任取999个建小顶堆,此时堆顶元素是最小的。然后遍历10000个数剩余元素,每一个元素与堆顶元素进行比较,若比堆顶元素大,将堆顶元素置为该值`arr[0] = nums[k]`,然后`heapify(arr, n, 0),此时的结果是将可能是top999中的数放到堆中`;若比堆顶元素小,遍历下一个元素,直到nums遍历结束。此时堆中元素就是topK
    
  8. 算法:连续子数组的最大和

  9. 反问:工作业务与技术栈

    • 业务:B端和C端
    • 技术栈:微服务,分布式,springboot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/270447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微擎模块 出现Error: template source ‘common/message’ is not exist!解决方法

今天有会员反馈微课堂分销中心打不开&#xff0c;错误提示模板找不到&#xff1a;Error: template source ‘common/message’ is not exist!&#xff0c;看了下这模板应该微擎框架通用的&#xff0c;进公众号会员管理-会员中心网址居然也打不开&#xff0c;提示一样的错误&…

多播ip地址配置和通信理解

经常有朋友问&#xff0c;为什么相同局域网的ip需要相同网段&#xff0c;为什么组播的网段可以不同&#xff1f; 比如&#xff1a; 在您的局域网&#xff08;192.168.1.0/24 网段&#xff09;中设置多播组时&#xff0c;您可以选择一个在本地网络范围内尚未使用的多播组地址。…

绿色装配式建筑——气膜建筑

伴随新时代的到来和发展理念的深入实施&#xff0c;装配式绿色建筑已经成为建筑业发展的主流趋势。本文将深入分析气膜建筑&#xff0c;采用绿色建筑技术和装配式的建筑模式&#xff0c;形成了一套完善的建筑体系。 气膜建筑以气膜结构为主体&#xff0c;采用新型高强度柔性薄膜…

批量归一化

目录 一、BN层介绍 1、深层神经网络存在的问题 2、批量归一化的解决方案 3、BN层作用位置 4、BN层在做什么 5、总结 二、批量归一化从零实现 1、实现批量归一化操作 2、创建BN层 3、对LeNet加入批量归一化 4、开始训练 三、简明实现 1、对LeNet加入批量归一化 2…

【Spring实战】02 配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

电商数据分析-01-电商数据分析指标

电商数据指标 电商数据分析涉及多个指标&#xff0c;这些指标可以帮助企业了解其业务表现、用户行为和市场趋势。以下是一些常见的电商数据分析指标&#xff1a; 销售指标&#xff1a; 总销售额&#xff08;GMV&#xff09;&#xff1a; 衡量特定时期内所有销售交易的总值。 平…

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢&#xff0c;就是不管算法竞赛还是找工作笔试面试&#xff0c;都是非常爱问爱考的&#xff0c;其实也是因为这个算法比较难懂&#xff0c;其实就是很难&#xff0c;所以非常个…

【环境配置】虚拟环境配置

创建虚拟环境 conda create -n pytorch python3.9安装成功提示 激活虚拟环境 activate pytorch安装pytorch 查看 python 版本——python 退出 python——exit() 对照 python 与 pytorch 的对应关系 pytorch 地址&#xff1a; https://pytorch.org/get-started/previous-…

Python in Visual Studio Code 2023年12月发布

作者&#xff1a;Courtney Webster 排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 12 月发布&#xff01; 此版本包括以下公告&#xff1a; 可配置的调试选项已添加到“运行”按钮菜单可以使用 Pylance 显示类型层次…

JAVA JDK8时间类之Period、Duration、ChronoUnit的使用【详解】

JAVA JDK8时间类之Period、Duration、ChronoUnit的使用 1. Duration1.1 简介&#xff1a;用于时间间隔(秒、毫秒、纳秒等)1.2 案例 2. Period时间间隔(年、月、日)2.1 简介2.2 案例 3. ChronoUnit3.1 简介案例 4. 案例所有代码&#xff1a; 1. Duration 1.1 简介&#xff1a;用…

边缘计算AI智能盒子的视频源必须是固定点监控摄像头吗?

边缘计算AI盒子的视频输入源&#xff0c;要求是RTSP或者GB28181&#xff0c;可以是固定点监控摄像头&#xff08;枪机、球机等&#xff09;&#xff0c;也可以是移动摄像头&#xff0c;例如执法记录仪、智能安全帽、布控球等&#xff0c;但由于RTSP输入要求摄像头有固定IP&…

中庸 原文与译文

《中庸》是中国古代论述人生修养境界的一部道德哲学专著&#xff0c;是儒家经典著作之一&#xff0c;原属《礼记》第三十一篇&#xff0c;相传为战国时期子思所作。 其内容肯定“中庸”是道德行为的最高标准&#xff0c;认为“至诚”则达到人生的最高境界&#xff0c;并提出“…

算法——哈希表

哈希表简介 **是什么&#xff1a;**存储数据的容器有什么用&#xff1a;快速查找某个元素&#xff0c;时间复杂度O(1)&#xff0c;空间复杂度O(n)**什么时候使用哈希表&#xff1a;**频繁查找某一个数&#xff08;这里不要忘了之前的二分&#xff0c;时间复杂度O(logN)&#x…

sqlilabs第三十二三十三关

Less-32&#xff08;GET - Bypass custom filter adding slashes to dangerous chars) 手工注入 由 宽字符注入可知payload 成功触发报错 http://192.168.21.149/Less-32/ ?id1%df 要写字符串的话直接吧字符串变成ascii码 注意16进制的表示方式 自动注入 sqlmap -u http:…

三相电机转差率为负值的情形

1.电机开始发电的特征 注意&#xff0c;电机因为有输入频率对原始旋转磁场的影响&#xff0c;在正常工作时&#xff0c;应该处于稳态&#xff0c;因为旋转磁场决定了这个系统的运转方向和运转的大致频率区间。它会处于力矩平衡态。但是&#xff0c;如果&#xff0c;此时电机处…

智能优化算法应用:基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.指数分布算法4.实验参数设定5.算法结果6.…

《Halcon 100项目-2》Halcon查找零件个数

Halcon查找零件个数 read_image (Image20231225201927, D:/image/bilibili/photo/屏幕截图 2023-12-25 201927.png) rgb1_to_gray (Image20231225201927, GrayImage)threshold (GrayImage, Region, 0, 128) draw_rectangle1 (200000, Row1, Column1, Row2, Column2) gen_recta…

redis基本用法学习(C#调用StackExchange.Redis操作redis)

StackExchange.Redis是基于C#的高性能通用redis操作客户端&#xff0c;也属于常用的redis客户端之一&#xff0c;本文学习其基本用法。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装StackExchange.Redis&#xff0c;如下图所示&#xff1a;   StackExchange.…

ElasticSearch 使用映射定义索引结构

动态映射 dynamic 可选值解释true默认值&#xff0c;启用动态映射&#xff0c;新增的字段会添加到映射中runtime查询时动态添加到映射中false禁用动态映射&#xff0c;忽略未知字段strict发现未知字段&#xff0c;抛出异常 显示映射 创建映射 PUT user {"mappings&qu…