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

美团

一面

  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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪吃蛇小游戏的代码实现之知识点铺垫篇

今天给大家介绍一个很经典的小游戏&#xff0c;它和扫雷在经典小游戏这方面可以说是旗鼓相当&#xff0c;它的名字就是贪吃蛇。贪吃蛇游戏最初为单机模式&#xff0c;后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。该游戏具体玩法是&#xff1a;用游戏把子上下左右控…

地域与文化,智能酒精壁炉选择的多元因素

不同地域和文化背景常常会影响人们的各种选择&#xff0c;尤其是对智能酒精壁炉的选择上&#xff0c;更会受到地域气候、文化传统以及个人审美等多方面因素的影响&#xff0c;下面将探讨不同地域和文化在智能酒精壁炉选择上的独特理由。 在寒冷地区&#xff0c;人们会更倾向于选…

【Filament】纹理贴图

1 前言 本文主要介绍使用 Filament 实现纹理贴图&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形绘制立方体 Filament 纹理坐标的 x、y 轴正方向分别朝右和朝上&#xff0c;其 y 轴正方向朝向与 OpenGL ES…

分页合理化是什么?

一、前言 大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 只要是干过后台系统的同学应该都做过分页查…

视频物体对象追踪AI技术模型——Tracking Any Object Amodally

项目地址&#xff1a;https://tao-amodal.github.io 论文&#xff1a;https://arxiv.org/abs/2312.12433 GitHub&#xff1a;GitHub - WesleyHsieh0806/TAO-Amodal: Official Code for Tracking Any Object Amodally AIGC专区&#xff1a;aigc 更多消息&#xff1a;AI人工智能行…

地图服务器GeoServer的安装与配置

文章目录 1.安装配置Java2.安装配置Tomcat3 安装配置GeoServer GeoServer提供了多种安装配置方式&#xff0c;但是本质上GeoServer是一个基于Java Web的项目&#xff0c;因此我们理论上只需要安装Java&#xff0c;并且将其放置在一个Web服务器&#xff08;例如Apache Tomcat&am…

uniapp使用colorUI

colorUI 微动画 | ColorUI 使用文档 1&#xff1a;把colorui里三个文件复制到自己项目中去 App.vue </script> <style> import url(colorui/icon.css); import url(colorui/main.css); import url("colorui/animation.css");-webkit-keyframes show {…

element步骤条<el-steps>使用具名插槽自定义

element步骤条使用具名插槽自定义 步骤条使用具名插槽: <el-steps direction"vertical" :active"1"><el-step><template slot"description">//在此处可以写你的插槽内容</template>/el-step> </el-steps>步骤…

【美团大数据面试】Java面试题附答案

目录 1.多线程代码示例 2.单例代码示例 3.LinkedBlockingQueue原理解析 4.模板设计模式讲解 5.生产者-消费者队列设计方法 6.堆内存和栈内存的区别 7.ThreadLocal底层机制 8.synchronized原理&#xff0c;存在的问题&#xff0c;解决方案 9.volatile使用场景和原理&am…

20231225在WIN10下使用SSH连接Ubuntu20.04.6

20231225在WIN10下使用SSH连接Ubuntu20.04.6 2023/12/25 23:03 https://jingyan.baidu.com/article/5552ef479e1856108ffbc9e3.html Win10怎么开启SSH功能 Win10怎么开启SSH功能,下面就一起来看看吧! 工具/原料 华硕天选4 Windows10 方法/步骤 点击左下角的开始菜单,打开Wind…

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势 本章节主要参考书籍《Xilinx Zynq-7000 嵌入式系统设计与实现 基于ARM Cortex-A9双核处理器和Vivado的设计方法 (何宾&#xff0c;张艳辉编著&#xff09;》 本章节主要讲述FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势&#xff0c;学习笔…

视频批量处理:随机分割方法,创新剪辑方式

随着数字媒体技术的飞速发展&#xff0c;视频处理已是日常生活和工作中不可或缺的一部分。在处理大量视频时&#xff0c;要一种高效、自动化的方法来满足需求。现在一起来看云炫AI智剪如何批量随机分割视频的批量处理方法&#xff0c;给视频剪辑工作带来创新。 视频随机分割4段…

恶意软件样本行为分析——Process Monitor和Wireshark

1.1 实验名称 恶意软件样本行为分析 1.2 实验目的 1) 熟悉 Process Monitor 的使用 2) 熟悉抓包工具 Wireshark 的使用 3) VMware 的熟悉和使用 4) 灰鸽子木马的行为分析 1.3 实验步骤及内容 第一阶段&#xff1a;熟悉 Process Monitor 的使用 利用 Process …

OpenCV之图像匹配与定位

利用图像特征的keypoints和descriptor来实现图像的匹配与定位。图像匹配算法主要有暴力匹配和FLANN匹配&#xff0c;而图像定位是通过图像匹配结果来反向查询它们在目标图片中的具体坐标位置。 以QQ登录界面为例&#xff0c;将整个QQ登录界面保存为QQ.png文件&#xff0c;QQ登…

新型智慧城市解决方案:PPT全文56页,附下载

关键词&#xff1a;智慧城市解决方案&#xff0c;智慧城市管理技术&#xff0c;智慧城市建设&#xff0c;数字城市建设 一、智慧城市宏观形势 1、政策支持&#xff1a;出台了一系列政策&#xff0c;鼓励和支持智慧城市的发展。这些政策为智慧城市的建设提供了政策保障和资金支…

Webpack基础使用

目录 一.什么是Webpack 二.为什么要使用Webpack 三.Webpack的使用 1.下载yarn包管理器 2.Webpack的安装 3.Webpack的简单使用 4.效果 四.Webpack打包流程 一.什么是Webpack Webpack是一个静态模块打包工具 二.为什么要使用Webpack 在开发中&#xff0c;我们常常会遇到…

Zookeeper入门

ZooKeeper 是一个开源的分布式协调架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题 本质 分布式的文件存储系统(Zookeeper文件系统监听机制)&#xff0c;是一个基于观察者模式设计的分布式服务管理框架 zookeeper的数据结构 Zookeeper的层次模型称作Data Tree,…

go语言初体验1--使用go install

当安装后go语言后。 尝试编写go程序。 当使用 go install 命令&#xff0c;报错。 go: go install requires a version when current directory is not in a moduleTry go install jvmgo\ch01latest to install the latest version通过查找资料。 用命令&#xff1a; go env …

C语言字符串处理提取时间(ffmpeg返回的时间字符串)

【1】需求 需求&#xff1a;有一个 “00:01:33.90” 这样格式的时间字符串&#xff0c;需要将这个字符串的时间值提取打印出来&#xff08;提取时、分、秒、毫秒&#xff09;。 这个时间字符串从哪里来的&#xff1f; 是ffmpeg返回的时间&#xff0c;也就是视频的总时间。 下…

树莓派,mediapipe,Picamera2利用舵机云台追踪人手(PID控制)

一、项目目标 追踪人手大拇指指尖&#xff1a; 当人手移动时&#xff0c;摄像头通过控制两个伺服电机&#xff08;分别是偏航和俯仰&#xff09;把大拇指指尖放到视界的中心位置&#xff0c;本文采用了PID控制伺服电机 Mediapipe Hand简介 MediaPipe 手部标志任务可检测图像…