字节基础架构一面+二面+三面已offer+京东阿里一面面经
蚂蚁一面
-
重载和重写
-
final关键字
-
linkedlist和arraylist区别
-
谁更适合做cpu cache
-
切换进程和切换线程
-
java里的同步操作
-
tcp reset报文
-
tcp长时间处于time wait怎么办
-
tcp状态机
-
中断
-
java io
-
自旋锁 偏向锁
- netty
京东一面
-
线程池实现原理
-
如何实现一个线程池demo
-
springboot如何自动装载
-
ArrayList和LinkedList有什么区别
-
SQL去重,有哪几种方式
-
inner join, left join, right join
阿里供应链一面
-
有没有对供应链做一个简单地了解?
-
有参与其他公司的面试吗?
-
在学校有没有参与学校的活动?
-
有没有组织过活动?
-
你是如何自学的?
-
HashMap是线程安全的吗?在多线程环境下使用会造成什么不好的结果?为什么会造成死锁?
-
volatile关键字的作用?
-
ThreadLocal有了解过吗?使用的时候有没有注意事项?(内存泄漏)
-
线程池中使用ThreadLocal有什么要注意的?
线程池中的线程是复用的,当一个任务结束之后,这个线程去执行新的任务时,可能会误用上一个任务的ThreadLocal变量
-
你的项目里有没有使用到线程池?并没有
-
对代理有了解过吗?代理和反射并不能等价。
-
项目中有没有用到设计模式?
-
Aop有什么了解吗?
-
垃圾回收机制聊一下?
-
MySQL的索引知识?%会导致索引失效,那%是加在前面会导致失效还是在后面加会导致失效?还是说都会导致失效?在前面加
-
Explain命令用过吗?
-
你的项目里用到了哪些框架?ssm,kafka,redis
-
怎么用得kafka?什么场景下用的
-
前端是如何知道有新的私信了?是前端在不停的轮询吗?我的项目是刷新一下才能看得到
-
那像qq这样的工具是不需要刷新的,如何实时地获取最新的消息?有考虑过如何做这样的功能吗?
- 有没有了解过一些分布式的框架?知道什么是分布式服务吗?你应该了解什么是分布式,分布式怎么来的,有些核心的框架
字节一面
-
tcp和udp的区别?
-
面向对象和面向过程的区别?
-
计算机的寄存器的作用?
-
定义一个全局变量,这个全局变量会放在什么地方?
-
程序的发生了异常,如何定位?
-
堆和栈的区别是什么?
-
程序中,会把什么东西放到栈里面?
-
Redis的持久化方法
-
http协议403错误码表示什么含义?
-
http头里面的host字段有什么含义?
-
kafka如何保证消息不会被重复消费?
kafka出现消息重复消费的原因:
-
服务端侧已经消费的数据没有成功提交 offset(根本原因)。
-
Kafka 侧 由于服务端处理业务时间长或者网络链接等等原因让 Kafka 认为服务假死,触发了分区 rebalance。
解决方案:
-
消费消息服务做幂等校验,比如 Redis 的set、MySQL 的主键等天然的幂等功能。这种方法最有效。
-
开发者在代码中手动提交 offset。
-
-
如果过去的话可能会做存储,消息中间件相关。
-
算法题,合并k个有序链表
字节二面
-
介绍一下kafka,怎么用的?
-
kafka的消费者与消费组?
-
kafka的特点?
-
kafka与其他的消息队列(如rocketMQ)的差别在哪
-
kafka的大吞吐量是如何实现的?
-
MySQL的特点,面试官说随便讲讲?
-
MySQL哪些字段需要建索引?
-
那如果一个字段是一个json格式的,不能建索引怎么办?
JSON列不能直接索引。要创建间接引用此列的索引,可以定义一个生成的列,以提取应该编制索引的信息,然后在生成的列上创建一个索引。
-
你这个牛客论坛项目实现了什么功能?
-
MySQL的CAS锁?
-
两个线程同时去修改MySQL的一个字段,如何进行操作?如何保证字段的一致性?答了加x锁
-
不加锁有没有其他的方式?答了CAS加版本号
-
SQL的语法?group by的含义?
-
查男生的第一名,sql怎么写?
-
常用的数据结构,b+树和哈希表使用场景有什么区别?
-
什么情况下需要用哈希表?什么情况下用b+树?
-
介绍一下内核态和用户态?
「当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。」
在内核态下,进程运行在内核地址空间中,此时 CPU 可以执行任何指令。运行的代码也不受任何的限制,可以自由地访问任何有效地址,也可以直接进行端口的访问。
在用户态下,进程运行在用户地址空间中,被执行的代码要受到 CPU 的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中 I/O 许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。
-
为什么要区分用户态和内核态?
在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。
所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。
比如 Intel 的 CPU 将特权等级分为 4 个级别:Ring0~Ring3。其实 Linux 系统只使用了 Ring0 和 Ring3 两个运行级别(Windows 系统也是一样的)。
当进程运行在 Ring3 级别时被称为运行在用户态,而运行在 Ring0 级别时被称为运行在内核态。
-
用户态和内核态的地址空间有什么区别?不会,强行扯到虚拟地址空间和物理地址空间的区别
对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。也就是说一个进程的最大地址空间为 4G。
操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。
具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,称为内核空间。而较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF)由各个进程使用,称为用户空间。
对上面这段内容我们可以这样理解:「每个进程的 4G 地址空间中,最高 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用。」
「换句话说就是, 最高 1G 的内核空间是被所有进程共享的!」
-
从虚拟地址到物理地址的转换过程?
-
mmu是干什么的?
-
java的gc处理经验,比如什么情况下会出现full gc? full gc如何处理?
System.gc()方法的调用 在代码中调用System.gc()方***建议JVM进行Full GC,但是注意这只是建议,JVM执行不执行是另外一回事儿,不过在大多数情况下会增加Full GC的次数,导致系统性能下降,一般建议不要手动进行此方法的调用,可以通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。
老年代(Tenured Gen)空间不足 在Survivor区域的对象满足晋升到老年代的条件时,晋升进入老年代的对象大小大于老年代的可用内存,这个时候会触发Full GC。
Metaspace区内存达到阈值 从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。-XX:MetaspaceSize=21810376B(约为20.8MB)超过这个值就会引发Full GC,这个值不是固定的,是会随着JVM的运行进行动态调整的,与此相关的参数还有多个,详细情况请参考这篇文章jdk8 Metaspace 调优
统计得到的Minor GC晋升到旧生代的平均大小大于老年代的剩余空间 Survivor区域对象晋升到老年代有两种情况:
一种是给每个对象定义一个对象计数器,如果对象在Eden区域出生,并且经过了第一次GC,那么就将他的年龄设置为1,在Survivor区域的对象每熬过一次GC,年龄计数器加一,等到到达默认值15时,就会被移动到老年代中,默认值可以通过-XX:MaxTenuringThreshold来设置。 另外一种情况是如果JVM发现Survivor区域中的相同年龄的对象占到所有对象的一半以上时,就会将大于这个年龄的对象移动到老年代,在这批对象在统计后发现可以晋升到老年代,但是发现老年代没有足够的空间来放置这些对象,这就会引起Full GC。 堆中产生大对象超过阈值 这个参数可以通过-XX:PretenureSizeThreshold进行设定,大对象或者长期存活的对象进入老年代,典型的大对象就是很长的字符串或者数组,它们在被创建后会直接进入老年代,虽然可能新生代中的Eden区域可以放置这个对象,在要放置的时候JVM如果发现老年代的空间不足时,会触发GC。
老年代连续空间不足 JVM如果判断老年代没有做足够的连续空间来放置大对象,那么就会引起Full GC,例如老年代可用空间大小为200K,但不是连续的,连续内存只要100K,而晋升到老年代的对象大小为120K,由于120>100的连续空间,所以就会触发Full GC。
-
gc是怎么实现的?回答的是3中垃圾回收算法
-
交换机和路由器分别工作在哪些层?
-
交换机是做什么用的?
-
http的post和get有什么区别?
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST没有。
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
-
https是如何保证安全?
-
证书的作用是什么?
-
算法题,快排思路寻找第k大。不会
-
算法题,打印n重循环
字节三面
-
介绍一下牛客论坛这个项目,我看你用到了Redis和kafka,介绍一下他们的技术原理?原理不会说,强行扯到项目里是怎么用的
-
项目背景,是学习过程中的练手项目
-
强制回答Redis和kafka原理 ...无语
-
Redis和kafka的分布式原理 不会...
-
分布式原理的心跳是怎么实现的 不会...
-
讲一下项目里怎么用的Redis和kafka
-
为什么一定要用Redis做缓存?如果做缓存的话,也可以做一些本地化的事情,为什么会想到用Redis
-
那kafka是怎么用的?
-
那这个地方为什么要选用kafka呢?
-
我看之前面试官说你对MySQL很熟,那你讲一下MySQL的实现原理 我???
-
那你讲一下innodb吧,懂不懂innodb?
-
innodb的mvcc的机制?幻读讲一下?
-
SQL解析相关知识?比如说SQL语法树? 我???
-
现在让你自己实现一个内存级缓存,选什么样的数据结构?要能够最快地支持点查
-
那让你自己实现一个线程池,这个线程池的线程数是固定的,现在有多个长任务多个短任务,长任务和短任务的数量都能超过线程池的线程数,那你要如何实现线程池,防止长任务把短任务饿死或者短任务把长任务饿死 ...服了,以前见过,没记住
-
接着问内核的调度原理?不知道,强行回答操作系统cpu调度算法
-
那你现在觉得内核是如何调度任务的?
-
那你现在觉得是如何避免长任务把短任务饿死的?时间片轮转
-
SQL的order By整个执行过程
-
MySQL的二级索引?
- 感谢你的时间