chris3will 发表于 2023-4-6 16:21

字节一面 今日头条byteitern 面经记录分享

2023.04.06
飞书平台远程会议,一面,字节跳动今日头条后端开发,暑期实习。
总时长1h15min左右

---

## 自我介绍
问:你的研究方向是什么?展开讲讲
问:你能实习多久?多久能去实习?

## 项目介绍

问:服务都是单机部署还是分布式部署?
问:是否是微服务式的?
问:你说说所做的所有项目或事情里面,遇到的最大的挑战是什么?是怎么解决的?
问:你觉得你最擅长的是什么?可以说是一些技术或者说技能方面的都可以?
问:你或者说某一门课程之类的都可以,你觉得你最擅长的什么?
问:如果说你个人能力方面、偏软素质这方面的,你觉得你最擅长的什么?
问:项目里你为什么当组长?

## 八股

### Java
问:讲一讲JVM内存结构,**再讲一下JVM内存管理和操作系统的虚拟内存是什么关系**? 这两者的交互是怎么实现的?

复盘的是时候发现,这部分可能是想问JMM在不同平台是如何实现的?有点深刻。
**参考回答**:
JVM内存结构分为以下几个区域:**程序计数器、Java虚拟机栈、本地方法栈、堆、方法区(元空间)**。其中,程序计数器、Java虚拟机栈、本地方法栈是线程**私有的**,堆和方法区是**线程共享的**。程序计数器用于线程执行的指令计数,Java虚拟机栈和本地方法栈用于存储方法调用和执行的局部变量等数据,堆用于存储对象实例,方法区(元空间)用于存储类信息、常量、静态变量等数据。


JVM内存管理的主要目标是尽量地提高内存利用率和性能,并保证应用程序的稳定性。内存管理主要涉及垃圾收集、内存分配、内存回收等方面。JVM通过垃圾收集器来自动回收不再使用的对象,内存分配则通过堆区实现,内存回收通过垃圾收集器实现。


操作系统的虚拟内存是为了解决物理内存不足而提出的一种技术。操作系统将磁盘空间虚拟化成一段连续的地址空间,称为虚拟内存。应用程序可以像访问物理内存一样访问虚拟内存,而操作系统将虚拟内存映射到物理内存,以实现虚拟内存的访问。

JVM内存管理与操作系统的虚拟内存之间的关系主要是JVM通过堆区使用内存,并由操作系统将堆区的虚拟内存映射到物理内存,以实现对内存的使用。同时,垃圾收集器的工作也需要占用操作系统的内存资源,垃圾收集器需要对虚拟内存中的内存块进行标记和清除操作,由于虚拟内存可能比物理内存大,因此可能会发生虚拟内存交换到磁盘中的情况,这也是操作系统和JVM之间的交互。**JVM和操作系统通过系统调用等方式实现对虚拟内存和物理内存的操作。**


### MySQL
问:事务的隔离级别有几种,分别有什么含义?
问:脏读,不可重复读,幻读都有什么问题,具体解释一下?

### Redis
问:你用过Redis对吧?谈谈你的了解

问:缓存穿透,缓存雪崩,缓存击穿这些情况都应该怎么解决?

### 408

#### 操作系统
问:IO多路服务用了解吗?讲一讲select,poll和epoll的区别。Epoll的两种触发方式讲一下?
**参考回答**:
IO多路复用是**指利用一个线程来监听多个socket的IO事件**,可以大大提高网络编程的性能和并发性能。常见的IO多路复用有select、poll和epoll三种方式。

select和poll方式都是通过轮询的方式实现的,即通过遍历文件描述符集合来检查每个文件描述符是否有事件到达。select和poll的缺点在于,每次调用都需要遍历整个文件描述符集合,效率不高,而且文件描述符集合的大小是有限制的。

epoll方式采用了**回调机制**,不再需要遍历整个文件描述符集合。epoll将文件描述符集合放入内核中进行监听,当文件描述符集合中的文件描述符有事件到达时,内核会将该文件描述符加入就绪链表中,同时调用回调函数。这种方式可以提高效率,同时能够支持大量的文件描述符。

epoll支持两种触发方式:LT(Level Triggered)和ET(Edge Triggered)。LT是默认方式,当文件描述符有事件到达时,**会持续通知应用程序**,直到应用程序处理完毕。而ET方式只会通知应用程序一次,直到应用程序处理完毕,才会再次通知。ET方式可以减少通知次数,提高效率,但是需要应用程序能够正确处理,否则**可能会造成丢失事件**的情况。

问:虚拟内存知道吗?主要用来解决什么问题?
**参考回答**:
虚拟内存是一种操作系统的技术,它可以将计算机硬盘中的部分空间作为内存来使用,使得计算机可以运行更多的程序或者更大的程序。这种技术可以让程序能够使用比实际物理内存更多的内存空间,从而提高计算机的运行效率。同时,虚拟内存还可以让操作系统更加灵活地管理内存,避免了内存碎片的问题。因此,虚拟内存是操作系统中非常重要的概念。

#### 计算机网络
如果说客户端或者说前端发送一个http请求,这个请求是如何到达后端的?中间涉及哪些协议?

## 手撕

每一题出的很快,不能切出飞书平台,后台会有记录,面试官会要求你先将思路,然后写代码,同时代码要可以运行,满足样例的结果。

[岛屿数量](https://leetcode.cn/problems/number-of-islands/)

代码参考:
```Java
class Solution {
    int ans = 0; //岛屿数量统计
    int[] dx = {-1, 0, 1, 0};
    int[] dy = {0, 1, 0, -1};
    public int numIslands(char[][] grid) {
      // 经典题目复习
      if(grid == null || grid == null) return ans;
      int m = grid.length;
      int n = grid.length;
      int[][] vis = new int;

      for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid == '1'){
                  if(vis == 0){
                        ans++; //发现一个岛屿
                        // 我们要将其进行延伸
                        vis = 1;
                        for(int k=0;k<4;k++){
                            int ni = i + dx;
                            int nj = j + dy;
                            if(ni>=0 && ni<m && nj >=0 && nj < n && vis == 0 && grid =='1'){
                              dfs(grid, vis, ni, nj);
                            }
                        }
                  }
                }
            }
      }

      return ans;
    }

    public void dfs(char[][] grid, int[][] vis, int x, int y){
      // 该函数要执行的功能就是进行发散
      vis = 1;
      for(int i=0;i<4;i++){
            int nx = x + dx;
            int ny = y + dy;
            if(nx >= 0 && nx < grid.length && ny >=0 && ny < grid.length && grid == '1' && vis == 0){
                dfs(grid, vis, nx, ny);
            }
      }
    }
}
```

[接雨水](https://leetcode.cn/problems/trapping-rain-water/)
参考代码:
```Java
class Solution {
    public int trap(int[] height) {
      // 标准的单调栈题目
      int ans = 0; // 求得我们最终的计算结果
      // 遍历每一个位置,找该位置左右两侧比其大的点,才能接水
      Stack<Integer> stk = new Stack<>();

      for(int i =0;i<height.length;i++){
            while(!stk.isEmpty() && height < height){
                // 第i个元素比当前栈顶要大,需要观察左侧情况,是否能接
                // 先把当前位置提取出来
                int curIdx = stk.pop();
                while(!stk.isEmpty() && height == height){
                  // 和当前高度相同的柱子我们要进行跳过
                  // 这些柱子构成一个大平层
                  stk.pop();
                }
                if(!stk.isEmpty()){
                  // 栈不为空,则栈顶元素此时比height要大
                  int highIdx = stk.peek();
                  // 我们把这一层灌上水
                  ans += (Math.min(height, height) - height) * (i - highIdx -1);
                }
            }
            stk.push(i);
      }

      return ans;
    }
}
```
## 智力题
问:*有20 瓶药丸,其中 19 瓶药丸质量相同为1克,剩下一瓶药丸质量为 1.1 克。瓶子中有无数个药丸。要求用一次天平找出药丸质量 1.1克的药瓶。*

**答**:可以从药丸的数量上来制造差异: 从第i 瓶药丸中取出i个药丸然后一起称重。如果第i 瓶药丸重 1.1克/粒,那么称重结果就会比全是1克的情况下重 0.1*i 克


## 总结
不知道后面会不会有面试跟进。
内容很丰富,时间跨度不小,对项目的追问还是挺多的。
八股部分问得比较宽泛,答完之后没有太多的追问,epoll部分确实好久妹啊看了。
JVM和虚拟内存的交互这一点确实很深,自己之前也没有了解过。
继续查漏补缺,积累经验吧!

www478347671 发表于 2023-4-6 16:29

多谢分享,上班久了感觉啥都不会了

初级菜鸟 发表于 2023-4-6 16:32


多谢分享,上班久了感觉啥都不会了

神幻静 发表于 2023-4-6 16:43

多谢分享,上班久了感觉啥都不会了

one23 发表于 2023-4-6 17:37

恭喜恭喜恭喜

嘉禾家和 发表于 2023-4-6 18:03

智力题
感觉答案有问题,天平应该是只知道哪边重 而不知道具体重多少吧

AnonHedgehog 发表于 2023-4-6 18:30

本帖最后由 AnonHedgehog 于 2023-4-6 18:33 编辑

嘉禾家和 发表于 2023-4-6 18:03
智力题
感觉答案有问题,天平应该是只知道哪边重 而不知道具体重多少吧
应该是有对应的砝码,能知道秤上的药丸的重量。一开始以为两边都放药丸{:1_908:}

rcg1997 发表于 2023-4-6 19:00

嘉禾家和 发表于 2023-4-6 18:03
智力题
感觉答案有问题,天平应该是只知道哪边重 而不知道具体重多少吧

万分之一电子天平也是天平

kailifei 发表于 2023-4-6 21:06

为三年后做准备

px307 发表于 2023-4-6 21:49

多谢分享,上班久了感觉啥都不会了
页: [1] 2
查看完整版本: 字节一面 今日头条byteitern 面经记录分享