百度

  • 关于MySQL数据库的crash-safe。csdn收藏
    • 其实crash-safe指的就是当mysql运行期间突然发生崩溃,mysql是如何做到数据不发生错误的
    • 主要是通过三个日志实现:redo-log,undo-log,bin-log
    • redo-log:发出某条修改数据库的语句的时候,mysql都是在内存里面修改某条数据,然后记录该条语句到磁盘里面,最后后台线程才会决定在某个时间真正把数据刷到磁盘里面(刷盘)。这样,即使在刷盘之前突然宕机,也可以通过redolog实现重写。
    • undo-log:当我们insert的时候,redo-log会记录一条相反逻辑的语句:delete。这样,当我们在事务执行期间如果发生宕机,也能快速回滚
    • binlog是用于有从机的时候,从机同步主机数据用的
  • url输入的全过程?
    • 输入网址
    • DNS寻址,将域名转化为IP地址
    • 与服务器完成TCP连接的三次握手
    • 客户端发送http请求报文,服务器发送http响应报文,浏览器页面渲染显示
    • 四次挥手断开TCP连接
  • InnoDB和MyIsam存储引擎的区别
    • 键:InnoDB必须有唯一索引(如主键),如果没有也会自动生成一列row_id作为主键,MyIsam不需要。MyIsam不支持外键,InnoDB支持。
    • 事务:InnoDB支持事务,MyIsam不支持。
    • 索引:InnoDB为聚簇索引,MyIsam为非聚簇索引
    • 锁:InnoDB支持行级锁,MyIsam只支持表级锁
    • MyIsam自带一个统计整张表的行数的变量,所以select count(*)会非常快。InnoDB需要一行行遍历
  • 如何数据库调优(csdn数据库优化方案整理)
    • sql优化:
      • select *要慎用,一次查询的数据太多
      • 不带where条件的sql要慎用
    • 合理使用索引:一般是指where字句的优化:
      • where后面跟的列一般要加索引
      • 以下几种都是为了防止mysql放弃索引的使用:
      • 不要用 !=
      • 不要用or,用union代替or
      • like 后面的关键字不要以占位符%开头
      • where num/2=4 计算不好
      • where substring(name,1,3) 使用函数不好
    • 数据库结构:分表(使用频率低的字段和高的字段分开)、增加中间表(减少联表查询)、增加冗余字段(减少联表查询,但要注意其他表的更新)
    • 读写分离:一台数据库支持最大连接数是有限的,如果用户的并发访问很多,一台服务器无法满足需求,可以集群处理。mysql集群处理技术最常用的就是读写分离。读写分离实现了负载均衡
    • 缓存:高并发查询热点数据,后端数据库不堪重负,可以用缓存来扛。
  • 讲一下联合索引?
    • ALTER TABLE table_name ADD INDEX index_name(col1,col2,col3)可以创建联合索引,也叫组合索引
    • 这个索引会让该表数据先以col1升序排列,col1相等的再按col2升序排列,col1与col2都相等的时候再按照col3升序排列
    • where col1=111 and col3=222中col3就没法命中索引,因为不连续。最左匹配原则:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
  • 网络模型7层
    • 在应用层和传输层之前多了个表示层(数据的加密)、会话层(会话管理)
  • 为什么需要三次握手而不是两次?
    • 因为如果少了最后一次,服务端就不知道它上次发的信息对方是否成功接收
  • 四次挥手说一下,为什么是4次?
    • 因为服务端可能还有数据没发完
  • nginx算法:做的是将请求分配给布置了相同服务的服务器集群
    • 轮询算法:按顺序将请求依次分配给下一个服务器
    • ip_hash算法:按照ip的hash值将某个请求分配给某个服务器
    • weight算法:服务器的性能有个权重
    • fair算法:根据响应时间,响应时间短的优先分配请求
    • url_hash算法:按照URL的hash值分配
  • Synchronized底层原理(脉络,详细请看csdn深入理解Java并发之synchronized实现原理以及)
  • https://www.bilibili.com/video/BV14i4y1G79E

一个对象被new出来以后,在堆里面存放,它的结构为:
markword:会记录锁的一些信息
classpointer:指向对象所属的类信息
成员变量:
补齐8的整数倍的一些字节:无意义
markword中记录的信息:
个人真面经 - 图1

synchronized代码块反编译之后实际上是被monitorenter和monitorexit包着。在hotspot更底层实际上经历过一系列的锁升级:
个人真面经 - 图2
一个对象new出来以后,它是一个普通对象:Object o = new Object();当它进入synchronized(o){}之后,该对象的markword就会发生变化,偏向锁位置为1,变成偏向锁。当有轻度的竞争时,该锁会升级为轻量级锁。有重度竞争的时候,锁才会升级为重量级锁。
在java6以前只有重量级锁。由于重量级锁实际上是依赖于操作系统的Mutex Lock,需要用户态切换为内核态,时间成本高。因此java6以后引入偏向锁和轻量级锁作为优化。

  • ReentrantLock底层原理:底层是基于AQS实现的,具体看打印
  • ARP协议
    • 是将IP地址转化为MAC地址(网卡地址/物理地址)的协议,是个链路层协议。
    • 链路层主要是MAC协议,链路层传输的数据帧,要包括源MAC地址和目的MAC地址,目的MAC地址就是通过ARP协议拿到。可见ARP协议是为MAC协议服务的
  • 基于springboot从0开始一个项目一个应用的步骤
    • 设置maven仓库(一般是new Spring Initializer,选择web..)、配置tomcat端口号、连接mysql、mybatis逆向工程生成mapper文件、创建controller、service、serviceimpl、dao等等
    • 项目配置文件:resources/application.yml
    • 静态资源目录:resources/static/
    • 视图模板目录:resources/templates/
    • mybatis映射文件:resources/mappers/
    • mybatis配置文件:resources/spring-mybatis.xml
    • 运行主启动类

阿里

  • 排序算法有哪些?(阿里钉钉)
    • 冒泡排序,每次从左到右,把大的往右移动。这样右边界就主键往左了
    • 选择排序,每次找到剩下元素里面最小的元素,放到左边
    • 插入排序,每次拿当前元素与之前的比较,小,则往前插队
    • 归并排序。一个MergeeSort主方法(拆分两边分别MergeeSort,返回合并结果),一个merge方法合并两个排好的数组
    • 快速排序。getIndex(int[]array,low,high)方法:
    • 桶思想排序
  • 多线程的一些问题(阿里钉钉)
    • 锁细化:synchronized修饰方法->修饰代码块
    • 锁粗化:太细了,需要频繁获取锁、释放锁,没必要
    • synchronized锁升级
    • 线程池:几大参数:核心线程数、最大线程数、队列种类、拒绝策略
    • CAS无锁
  • InnoDB和MyIsam存储引擎的区别(阿里钉钉)
    • 键:InnoDB必须有唯一索引(如主键),如果没有也会自动生成一列row_id作为主键,MyIsam不需要。MyIsam不支持外键,InnoDB支持。
    • 事务:InnoDB支持事务,MyIsam不支持。
    • 索引:InnoDB为聚簇索引,MyIsam为非聚簇索引
    • 锁:InnoDB支持行级锁,MyIsam只支持表级锁
    • MyIsam自带一个统计整张表的行数的变量,所以select count(*)会非常快。InnoDB需要一行行遍历

阿里交易流程团队(已挂)

总结:1、说话的时候有些不自信,还反问对方,是这样的不?2、遇到陌生的问题没办法思考了,不太会扯

  • 对于10亿个订单数据,它分布在各个服务器上,如何对它进行排序?
    • 比如有十台服务器,用归并排序,两两一组先排好,比如1、2号服务器先按顺序排好他们的数据
  • 如何不使用中间件比如redis,去实现一个分布式锁?
    • 是否进程可见
    • 是否互斥
    • 是否可重入
    • 性能够不够高
  • linux上ping一个网络,有ping过吗?
  • mysql的缓冲区知道吗?
  • 一个项目刚启动,收到的请求很慢,过一会就快了,为什么? JIT相关?
    • JIT是个即时编译器,能把JVM将class文件解释成的机器码保存起来,便于下次使用,这就类似于纯编译型语言了,下次就快了
  • 为什么那样会导致索引失效?
  • 几个ClassNotFoundException的区别
    • Java基础知识查漏补缺

阿里钉钉(自我感觉良好,挂了)

总结:应该再自信一点

  • 快排的实现方式,口述一下?分析一下它的时间复杂度?
  • 平衡搜索树的时间复杂度。log2N
  • spring的ioc是什么?依赖注入是什么?
  • 项目你做了什么?
  • 类加载的时候,创建了多个Class对象的时候,会不会产生两个对象呢?
  • 类加载器的分类:
    • Bootstrap ClassLoader
    • Extension ClassLoader
    • Application ClassLoader

个人真面经 - 图3
双亲委派模型:首先会交给父加载器加载,父加载器加载不了,再给子加载器加载

蚂蚁数据部(等三面)

  • lambda表达式的原理是什么?
  • 什么是依赖注入?
    • 依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC 容器)负责把他们组装起来。
  • 快速排序算法为什么不稳定?
    • 它只表示两个值相同的元素在排序前后是否有位置变化。如果前后位置变化,则排序算法是不稳定的,否则是稳定的。稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功。
  • 快排和堆排序?
    • 快排:NlogN,不稳定
    • 堆排序:NlogN,不稳定
    • 选择排序也不稳定,除了这三个,其他的算法都是稳定的
  • 设计模式的六大原则
    • 单一职责模式:通俗的说,即一个类只负责一项职责。
    • 里氏替换原则: 子类可以扩展父类的功能,但不能改变父类原有的功能。能不重写就不重写
    • 依赖倒置原则:核心思想是面向接口编程
    • 接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。(接口中尽量少一些用不上的方法)
    • 迪米特法则:尽量降低类与类之间的耦合。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
  • 装饰者模式和适配器模式的区别?
    • 适配器模式:我想用Translator类的对象去调用Speaker类的对象的某个方法,就利用一个桥梁去连接他们

个人真面经 - 图4

  • 装饰模式:是你还有你,一切拜托你
    • 加锁的逻辑?再复盘一遍
  • 检查redis中有没有三级分类的数据
    • 如果有,直接返回,结束
    • 如果没有,调用查询数据库的方法。查询数据库的方法是加锁的,在方法里面,再次判断redis里面有没有数据(避免多线程查询数据库的关键)。如果没有,真正去查询数据库。
      • 项目中最有成果的一件事情?
      • 贪心思想是什么?0-1背包问题的解法
  • 贪心思想总是求的局部最优解,总是考虑当前情况的最优解。但像01背包问题里面用贪心思想就得不到全局最优解。参考买卖股票的最佳时机Ⅱ
  • 动态规划
    • 判断二叉搜索树??????????????????????????
    • 了解反射吗?
  • 反射可以在运行时为我们提供一些类的结构信息,包括属性、方法、构造器等结构
  • 用处:在运行时才决定创建哪个对象(这就是动态性),比如改进后的单例模式。
  • 反射的一切操作都是从Class对象开始的。首先要获取这个对象。然后才能去获取该类的属性、方法、构造器等结构、操作某个对象。
  • https://blog.csdn.net/qq_26558047/article/details/109745018 反射创建对象和new一个对象的区别
    • 对多态的理解??
    • JIT?
  • https://blog.csdn.net/qq_36042506/article/details/82976586
  • just in time complier即时编译器,是JVM为了优化java的一种手段。早期jvm是个纯粹的解释型语言,对.class文件解释一句执行一句(解释为机器码),没有保存完整的机器码,这样非常慢。在执行时JIT会把翻译过的机器码(使用频率高的)保存起来,已备下次使用,因此从理论上来说,采用该JIT技术能够,能够接近曾经纯编译技术。
    • 锁在操作系统层面怎样实现的?
    • Linux的文件系统了解吗,什么是文件描述符表
    • 进程的内存映象
    • 如果一个应用程序访问一个不允许访问的内存(如0x0),会发生什么?
    • 红黑树的特性?
    • 层序遍历可以用深度优先吗?
  • 可以,此题的关键在于用height记录层数
  • 要先新建一个list存放在result里面,再去取,存值。
    • 最长有序子串的长度。例如[“aaa”,”bcd”,”zzz”,”bcdef”,”def”] aaabcddefzzz
  • 动态规划
    • redis与memcached有什么区别,为什么选择Redis,而不是memcached
  • redis支持5种数据类型,而memcached只支持文本
  • redis支持持久化RDB和AOF两种方式,而memcached不支持持久化
  • redis速度比memcached快
    • final关键字的用法,final域的重排序规则(不了解),final修饰形参时会怎么样(同final修饰变量)
  • final域的指令重排限制:

https://blog.csdn.net/weixin_37948564/article/details/105781412

  • 对final变量的写操作:不允许跳出构造器,保证final一定先被初始化
  • 对final变量的读操作:必须在引用指向完成才能读
    • Object类中的方法(toString、hashCode、equals、wait、notify、notifyAll、getClass、clone和finalize)
    • 知道乐观锁和悲观锁吗,应用场景
  • 乐观锁:
    • 描述:每次读数据的时候都假设人家不会修改,不上锁,但写入前时候会看看这个数变没变
    • 数据的版本号;CAS例如atomic
  • 悲观锁:
    • 描述:每次读数据的时候都假设人家会修改,上锁,不让别人update
    • synchronized
      • 线程池初始化方式和参数:Executors方式和ThreadPoolExecutor方式
  • Executors.newSingleThreadExecutor()
  • new ThreadPoolExecutor(参数)
    • 快速向未到达corePoolSize的线程池添加两个线程,会向queue中添加然后转发运行还是直接向corePoolSize中增加并运行?
    • bfs算法????????????????????????????????
    • 分布式session,各种解决方案的优点和缺点
  • 1、各个tomcat存放相同的session,一个改变,其他同步。数据量太大
  • session存放在cookie里面。cookie存放数据有限;不受服务端控制
  • nginx反向代理,一个用户固定一个服务器。害怕服务器宕机
  • 后端统一管理session,redis,还可配置集群
    • Spring Boot常用的框架(starter)
  • spring-boot-starter-web
  • spring-boot-starter-data-redis
  • mybatis-spring-boot-starter
  • spring-cloud-starter-openfeign
  • spring-boot-starter-test
    • Spring MVC接收到请求时的处理流程
  • 客户端发送http请求至DispatcherServlet
  • 通过handlermapping找到相应的controller,处理请求
  • controller调用service,得到处理结果返回给DispatcherServlet
  • DispatcherServlet通过ViewResolver处理视图映射,拼上前缀,找到对应的前端页面,并渲染。
  • 将前端页面返回给客户端(http响应)
  • 参考:

https://blog.csdn.net/cswhale/article/details/16941281

  • Spring的IOC
    • https://www.cnblogs.com/superjt/p/4311577.html
    • IOC中的依赖注入是实现控制反转的一种实现方式。
    • 所谓控制翻转是指:以前没有spring的时候,我们进行web开发的过程中,对象A需要依赖对象B,需要在A对象里面new一个B对象,这样协同完成某项任务。但企业级应用的依赖关系特别复杂,导致对象与对象间的耦合太严重,牵一发而动全身。因此,我们不让A掌握B的产生,主动权交给springioc,当A需要用到B的时候,再去注入对象B,这样就能解耦了。这就是所谓的控制反转。
  • hashmap的扩容原理
    • 个人真面经 - 图5
  • 堆内存不够用时可能的操作(垃圾回收,扩容堆)
  • redis的存储原理
    • string
    • list
    • hash
    • set
    • zset
  • AVL树深度差不能超过多少?红黑树时间复杂度
    • 1,logN
  • 讲一下什么样的情况能用动态规划?
  • TCP发数据过程中必须按顺序接收吗
    • 不一定
    • 个人真面经 - 图6
  • 虚拟内存和物理内存谈一谈
  • String数组的最长公共前缀??????????????????????????
  • 死锁,以及怎么解决死锁
    • 线程之间出现了循环等待资源的情况,举个栗子:线程a拿到了锁1,现在还想要锁2;线程b拿到了锁2,现在还想要锁1。
    • 如何解决:
      • 破坏互斥条件,这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)
      • 破坏请求与保持条件,一次性申请所有的资源。
      • 破坏不剥夺条件,占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
      • 破坏循环等待条件, 靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。比如两个线程都是按照一样的顺序申请两把锁
  • mysql查找过程

个人真面经 - 图7

  • LRU
  • 项目中用的中间件的理解
  • 具体场景的排序策略?Collections.sort底层排序方式?
    • 从时间、空间复杂度、是否要求稳定性角度考虑:比如数据量n的大小不同的场景
    • Collections.sort底层排序方式为mergeSort归并排序
  • 说说自己参与的项目,技术难度在哪里?
    • 说一说下订单,减库存
  • 阻塞队列不用java提供的自己怎么实现,condition和wait不能用
  • 介绍你的那个项目的来源是?为什么要做这个项目?目的是?
    • 看了一些博客,关于如何实现一个高并发电商。就希望通过一些框架去实现这个项目,就慢慢做下去了。
  • 查询sal表里面第二大的那条记录,也就是300 | name | salary | | —- | —- | | Tom | 100 | | Mike | 200 | | Jerry | 300 | | John | 400 |

要求查询结果是:

SecondMaxSalary
300

解答:使用order by结合limit
select sal.salary as SecondMaxSalary order by sal.salary desc limit 1,1
解释:
desc:降序
limit:从行号为1这一条(第二条)开始,只要1条
limit:limit 1表示只要一条数据,此时就只是第一条

  • sleep()和wait()的区别,追问wait()为什么要在同步代码块或同步方法里面?
  • 数据库连接池的几个参数介绍一下

    • 基本信息:
      • driverClassName=com.mysql.jdbc.Driver
      • url=jdbc:mysql://localhost:3306/mydb1
      • username=root
      • password=123
    • initialSize:初始池大小,一开始池中就会有这么多个连接对象
    • maxActive=8:最大活跃连接数,包括正在被使用的和空闲的
    • maxIdle=8:最大空闲连接。这是从浪费系统资源角度考虑
    • minIdle=8:最小空闲连接。这是从随时待命角度考虑
    • maxWait=-1:最大等待时间。负数:无限等待,不抛异常
    • 提交方式:默认AutoCommitted
    • 只读连接:否
    • 事务的隔离级别:默认为可重复读

      阿里蚂蚁大数据部(二面)

  • ArrayList删除元素的时候要注意什么问题?有什么异常吗?

  • 以太网了解吗?
  • 堆排序
  • 1亿条数据取前1000条,priorityQueue时间复杂度、空间复杂度
  • 复盘一下统一的笔试题目?
  • 虚拟内存?虚拟地址可以一样吗?虚拟地址空间可以有多大?
  • linux指令?查询最占用cpu内存的进程?。。
    • top:查看cpu使用情况,列出占用cpu从高到低的进程
    • free:查看内存使用情况
    • grep:包含指定文件名的文件
    • find:找
    • df:查看磁盘的使用情况
    • kill -9:结束某个进程
    • netstat -anp|grep port:查看某个端口的使用情况
    • chmod:权限 777
  • tryLock()方法失败之后做什么?
    • 一般就是用if(lock.tryLock())包住代码块,如果成功,执行业务。如果失败就执行else中的代码。
  • restful??put请求的url后面能带参数吗?
    • GET:查询用户信息列表或者查询某个用户的信息
    • POST:新建用户信息
    • PUT:更新用户的的全部字段
    • PATCH:更新用户的部分字段
    • DELETE:删除某个用户的信息

腾讯(一面二面)

  • http和https的区别
  • socket编程,Time_Waited状态
  • 一万条敏感词,对某句话进行敏感判断
  • redis比数据库快多少倍?
  • linux指令,查看cpu的一些指令
    • top:查看cpu使用率、内存使用率..也有动态显示运行中的进程并且排序
    • ps -aux 查看所有进程
    • free查看内存情况
  • C语言?
  • 攻击http的漏洞有哪些?sql注入?
  • 求两个字符串的最长公共子序列?什么算法?
    • 动态规划:dp为一个二维数组,先把第一行和第一列的值赋上。再去用到了左边、上边、左上方这三个元素

腾讯牛客面经

  • 十亿个数的集合和10w个数的集合,如何求它们的交集。集合的数字不重复
    • 将10w个数据放到hashmap里面,然后遍历10亿个数据即可。节省空间
  • 十亿和数找到前100个最大的
    • 堆排序
  • Time_Waited状态有什么用?
    • 防止最后一次ACK没有被正确的传给被动方,被动关闭方会再次发送FIN信号。
  • TCP四次挥手讲一下过程,最后一次ack如果客户端没收到怎么办。
  • 对于socket编程,accept方法是干什么的,在三次握手中属于第几次,可以猜一下,为什么这么觉得。

//1.创建服务器端的ServerSocket,指明自己的端口号
ServerSocket ss = new ServerSocket(8899);
//2.调用accept()表示接收来自于客户端的socket
Socket socket = ss.accept();
//3.获取输入流
InputStream is = socket.getInputStream();

  • accept方法是用于获取客户端的socket的,相当于获得一条TCP连接。
  • 发生在三次握手之后,因为调用accept方法之后,就获取到了Socket对象了,就可以拿到客户端发送的数据了。肯定是建立连接之后才能这么做啊。

    海量数据处理方法

    第一部分,hash(x)%N分成若干小文件

  • 海量日志数据,提取出某日访问百度次数最多的那个IP。

    • 将这一个大文件分成1000个小文件,分的方法:将这个每个ip%1000,对1000取余之后,放在对应的小文件里面。(其实就是一种桶思想,分而治之)
    • 对每个小文件中的每个ip进行频率统计,找出最大的ip。统计方法:hashmap。
    • 1000个文件中取频率最大的ip
  • 寻找热门查询,300万个查询字符串中统计最热门的10个查询

    • hashmap统计频率
    • 堆排序,top10的小顶堆。时间复杂度为300wlog10
  • 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
    • 对于每个单词x,hash(x)%5000,然后按照该值存到5000个小文件
    • 此题和第一题一样的,只是最后不是要最多的,需要把每个小文件中的所有词都参与比较
  • 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
    • 若同一个数据只存在于一台电脑中,好办。直接统计每台电脑中的top10,再用堆排序排出这100个数据的top10
    • 若同一数据可能分布在不同的电脑中。先通过hash(x)%10将其移动,保证同一数据只存在于同一台电脑上,再按照上述方法
  • 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
    • 先通过hash(x)%10将query移动到不同的文件里面,保证相同的query一定在一个文件里面。
    • 对每个文件里面的query进行频率排序(通过hashmap统计频率)。
    • 对十个文件进行归并排序/堆排序
  • 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
    • 5×10^9×64B=320GB>>4GB,因此只能采用分治,将大文件分为1000个小文件,hash(url)%1000,将其分散带不同的文件里面。对a、b这两个大文件进行相同的操作,那么现在就有这些文件:a0,a1,a2,,,a999和b0,b1,b2,,,b999
    • 显然a0只可能和b0中有交集。我们只需要对这1000对数据分别取交集就行了。具体取的方法:hashset
  • 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
    • 如果太大没法一次读入内存,hash取模分成小文件,分别去重,合并即可

第二部分,多层划分

第三部分,索引、倒排索引等等

美团牛客

  • mysql事务隔离级别和实现原理(mvcc):https://blog.csdn.net/suifeng629/article/details/99412343
    • 读未提交:select加共享锁,增删改加排它锁
    • 读已提交:select通过mvcc版本去读,读到最新的版本。有增删改的事务提交之后才会改变版本
    • 可重复读:一个事务里面,第一次select的是哪个版本,后面select的还是这个版本,无论该版本是否更新,从而保证了可重复读
    • 串行化:select也会加排它锁
  • redis主从复制、redis哨兵机制、redis脑裂解决方案
  • java8新特性
  • JVM G1和CMS区别
    • G1是针对整个堆内存的,CMS仅仅是清理老年代
    • G1将内存分为一块块的region,分别回收。适合大内存的机器,因为大内存的机器如果对整个堆进行清理,会很慢。
    • CMS采用标记清除算法,容易产生垃圾碎片,而G1不会产生
    • 二者的清理过程都是:
      • 初始标记-并发标记-重新标记-并发清理
      • 其中1、3都有STW
  • redis 如何实现高并发和高可用
    • 高并发:主从复制🡪主负责写,从负责读
    • 高可用:主备切换,master宕机了,slave顶上
  • MYSQL如何优化
    • 见“百度”章节
  • 线程安全的类有哪些,平时有使用么,用来解决什么问题
    • 线程安全集合类:vector/hashtable/concurrenthashmap/阻塞队列
    • FutureTask+callable
    • CompletableFuture
  • mysql日志文件有哪些,分别介绍下作用
    • redo-log
    • undo-log
    • binlog
  • 你们项目为什么用redis,快在哪,怎么保证高性能,高并发的
  • redis字典结构,hash冲突怎么办,rehash,负载因子
  • jvm了解哪些参数,用过哪些指令
    • -Xmx4g:堆内存最大值为4GB。
    • -Xms4g:初始化堆内存大小为4GB 。
    • -Xmn1200m:设置年轻代大小为1200MB。增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    • -Xss512k:设置每个线程的堆栈大小。
  • 一个热榜功能怎么设计,怎么设计缓存,如何保证缓存和数据库的一致性
    • 使用list作为存储结构,ltrim key1 0 3 这条指令会删除0-3这四条数据以外的元素。我们如果按照时间顺序插入到list,可以保留前多少条最新评论。
    • 可以用zset再去保存一个点赞数最高的前多少条数据
    • 因为评论无需全量保存
  • redis集群,为什么是16384,哨兵模式,选举过程,会有脑裂问题么,raft算法,优缺点
  • jvm类加载器,自定义类加载器,双亲委派机制,优缺点,tomcat类加载机制
    • 阿里钉钉
  • tomcat热部署,热加载了解么,怎么做到的
  • cms收集器过程,g1收集器原理,怎么实现可预测停顿的,region的大小,结构
    • cms:
      • 初始标记:根可达
      • 并发标记:和用户进程一起
      • 重新标记:最终确定,修正并发标记时导致的一些错标
      • 并发清除:和用户进程一起
    • g1怎么实现可预测停顿的:
      • 因为它有计划的避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。这样就保证了在有限的时间内可以获取尽可能高的收集效率。
  • 内存溢出,内存泄漏遇到过么,什么场景产生的,怎么解决的
  • 锁升级过程,轻量锁可以变成偏向锁么,偏向锁可以变成无锁么,自旋锁,对象头结构,锁状态变化过程
  • 怎么理解分布式和微服务,为什么要拆分服务,会产生什么问题,怎么解决这些问题
    • 服务的发现:ip+端口号让客户端、调用者知道
  • Innodb的结构了解么,磁盘页和缓存区是怎么配合,以及查找的,缓冲区和磁盘数据不一致怎么办,mysql突然宕机了会出现数据丢失么
  • redis字符串实现,sds和c区别,空间预分配
  • redis有序集合怎么实现的,跳表是什么,往跳表添加一个元素的过程,添加和获取元素,获取分数的时间复杂度,为什么不用红黑树,红黑树有什么特点,左旋右旋操作
  • 怎么理解高可用,如何保证高可用,有什么弊端,熔断机制,怎么实现
  • 对于高并发怎么看,怎么算高并发,你们项目有么,如果有会产生什么问题,怎么解决

美团一面

  • Future和CompletableFuture:研究一下
  • ThreadLocal和参数传递,为什么不用参数传递?ThreadLocal原理
  • sorted set的底层原理skiplist
  • spring有哪些开发者可以改变的地方?
  • 为什么要用redlock?自己用redis实现分布式锁不也很简单吗?
  • 算法题:字符串相乘?
  • 说说你用的这些框架的源码?

美团一面

  • ConcurrenHashMap的源码细节?
  • hash冲突如何解决?源码?
  • 多线程如何实现:线程池的几个参数,全都要??
  • 封装、继承、多态?
  • 项目:如何保证写数据库和写redis同时成功、同时失败?项目没做
  • redis底层源码熟悉吗?
  • 为什么要再次检查redis里面有没有?查redis里面没有的话,写redis的过程太慢了,导致其他线程都要等待,这个怎么解决?
  • 使用Runnable和Thread两种方式创建线程有什么区别?

hr面

个人真面经 - 图8

1一上来介绍一下自己和所做的项目
基于springboot+springcloud做的一个小型的电商平台
数据库设计
模块:

2介绍项目过程中遇到的最大难点
引入缓存之后导致的问题:锁时序问题、缓存击穿问题的解决
购物车如何实现对登录和未登陆状态的区分
解决提交订单的幂等性问题:数据库的唯一约束和token机制
JSR303分组校验,不算是难点,但很巧,很方便
订单模块的消息队列还没解决

3这个项目还有没有其他参与的人,说一下其他人的主要工作
主要还是自己独立完成的,做这个项目主要是为了强化一下自己的技术栈,对技术有进一步的认识。在做之前倒请教过已经工作的同学,他觉得商城系统需要用到很多的技术栈,很适合锻炼,于是就参考了博客上面很多大佬的思路,做了一个这样的项目。

4这个项目有没有其他可支撑或者参考的人
有,博客上jeason

5怎么评价这个项目完成的好坏
功能模块:是否满足用户的需求,这是基础。
性能:吞吐量(优化业务、技术栈等等),能否承受住高并发。可靠性
经济性:优化业务,减少服务器的个数。比如session的存储方案
6除了这个项目还有没有其他项目

7职业规划
希望在一个有沉淀的互联网公司一直做下去,从业务开始,毕竟头一次参加工作,可能一开始会觉得有些陌生,但自己相信能积极学习,把自己不懂的业务通过学习、向大佬请教,逐渐变成一个技术上的大牛。随着懂得越来越多,慢慢成长,自己希望能变成一个技术上的主管,如果可能的话,最终希望能成为一个后端开发的架构师。

8为什么选择蚂蚁金服这个岗位(一是为什么选这个岗位,二是为什么选这个部门,要两点都答)
众所周知,蚂蚁旗下有很多产品,比如支付宝、余额宝、芝麻信用等等。尤其是支付宝,每秒钟能处理十多万的交易,而且交易风险也低于十万分之一,这个在技术上是非常了不起的,在国内和国际上都是顶尖水平,因此我认为蚂蚁是一个非常有技术实力和沉淀的地方。
为什么选这个部门:
大数据是个非常有前景的方向,即便在IT行业也是如此。而且,在信息化时代、互联网时代,数据量会越来越大,大数据的高效处理在未来的作用也越来越大。在项目上面来说,意味着数据并发量会越来越大,这对于我们的的一些项目会产生巨大压力,如何高效处理海量数据,提高系统的高可用,对程序员来说都是巨大的挑战,也是巨大的机遇。

9本科和研究生成绩
9本科研究生都就读软件工程这个专业,是哪些点吸引你让你喜欢这个专业

10问竞赛经历
节能减排大赛:建模仿真
湖北省翻译大赛:省三等奖

11什么时候可以实习,实习时间多久
7、8月两个月,毕业论文

你还有什么问题问我?

为了更好地胜任这个岗位,我还需要补充哪些技能?
入职后是否有产品培训和技能培训?
接下来的流程是什么?
如何评估员工在试用期间的表现?

快手牛客一面

  • 介绍一下mysql索引
    • 是什么,优点。
    • 分类:用的多的是主键索引、普通索引
    • 数据结构b+树大体是个什么样的,有哪些优点
  • (name,age,city)联合索引,name=’xx’ and age>12 city=’dd’用到的索引
    • 前两个。因为age按照范围查的时候,city就不是按顺序排列的了
  • 非聚簇索引非索引项叶子节点的其他数据是什么:主键和其他带索引的列数据
  • 非聚簇索引和聚簇索引非叶子节点所存的数据是什么?
    • 该索引的值呀
  • 覆盖索引是什么
    • 避免了回表查询。。以主键索引和普通索引举例(有点蒙,辅助索引的叶子节点是只存储了聚簇索引的值吗?)
  • 隔离级别
    • 可重复读:可能导致幻读
    • 实现原理:美团牛客
  • mysql锁
    • 共享锁、排它锁、行锁、间隙锁。
  • 过滤器是由的由谁提供的,拦截器是由谁提供的?
    • 前者先执行,前者由servlet提供,后者由springmvc提供
  • volatile
    • 保证多个线程执行的时候,读在写之后执行
    • 不能保证原子性,还得用原子类

腾讯一面

败还是败在现场撸算法

  • 进程间通信方式?
    • 信号量:该数据结构保证只有n个进程能进入临界区代码
    • 共享内存:多个进程共享这一块内存
    • 套接字:客户端和服务端进程之间的网络通信
    • 管道:匿名管道、有名管道
    • 消息队列:
  • redis主从复制了解吗?(只是听说了哨兵模式)

简化文件路径
个人真面经 - 图9
找出大于其他元素两倍的元素

sql
有一个用户表user(user_id)和一个文章表article(user_id, article_id),找出所有未发文用户的user_id
除了not in还有哪些方法?

腾讯二面

Linux操作指令了解吗?ping?

字节跳动四面

  • 手写一个线程池
  • 302、100?http状态码?
    • 302表示重定向
    • 100表示请求者需要继续发送请求
  • ThreadLocal和参数传递,为什么不用参数传递?ThreadLocal原理
  • 反射,结合spring说
  • 进程在虚拟内存里面由哪几个部分组成
  • 项目中的Token
  • 终止线程的方式,stop的缺点?手写一个线程池?volatile关键字的作用?
  • 强软弱虚引用?

    字节支付业务(一面)

  • 序列化和反序列化?java自带的序列化规则是什么?

  • volatile关键字的作用?举个线程可见性安全的例子?指令重排是谁重排的?
  • Spring中Autowired和Resource注解的区别?spring怎么样解耦的?
  • wait()方法是怎样阻塞队列的?(底层)
  • CountDownLatch不要忘记了

抖音面试(9.2)

  • 请求方式有哪几个?
  • http状态码:1开头的是?
  • 进程间的通讯方式
  • I/O模型有几种?
  • TCP怎么保障可靠性传输的?
  • 开发中如何实现串行化?
  • MVCC底层实现?
  • 算法:最大矩形

华为

技术面

设计模式:写一个单例模式。线程安全怎么去设计?
泛型快排怎么写?
防止sql注入:白名单
课程表算法

项目相关

你是不是很懂hadoop、flink这些?

8.手撕代码 leetcode692 前K个高频单词

hr面

1.自我介绍
2.介绍课题
3.学习遇到的困难
4.你觉得你的优点是什么 举个例子
5.反问环节
为什么选择华为
2、 为什么选择开发,开发很辛苦的balabala
3、 实习的同事怎么评价你
4、 还跟我聊了下5G,问我怎么看待5G
聊研究生的事情,学了什么课,自己觉得优势在哪,以后想在哪发展

腾讯

工厂模式和抽象工厂模式用分别在哪些地方?
链表和数组的存储结构?存在什么位置..

Future的原理?Future是怎么保证线程安全的?

待解决

设计模式:写一个单例模式。线程安全怎么去设计?(细一点)

泛型快排怎么写?

防止sql注入:白名单

课程表算法

还有哪些导致索引失效的场景?
除了OOM、StackOverFlow还有哪些内存溢出?
RPC的底层原理上讲,和http的区别?

indexOf(Object o)方法:返回第一个o元素,调用的是equals方法。
addAll():合并两个list?

MyBatis的xml里面有哪些标签?
spring里面bean的作用域有哪些?在哪指定?

  1. <bean id="person" class="com.mengma.scope.Person" scope="singleton"/>
  1. @Component("testBean2")
  2. @Scope("prototype")
  3. public class TestBean {
  4. }

spring属性注入有哪些方式?@Autowired是什么?

项目里面:万一某台服务器宕机了会怎么办?
image.png
如图所示,第三台机器宕机之后,映射关系就会改变,3号任务原来是由0号机器执行的,现在1号机器也能抢3号任务了,为了防止这种3号任务同时被两台机器执行,就将3号任务对应的gmt_scheduled改为未来的1min,目的就是为了等待0号机器执行完,才可能被1号机器执行。