2023-11-15 06:38:27
字节后端面试未通过不代表个人能力差,面试表现受多方面因素影响,且面试中考察的知识点可通过针对性学习掌握。以下是对面试涉及知识点的详细分析:
一面知识点互斥条件:至少有一个资源被标记为只能被一个进程占用,即一次只能有一个进程使用该资源。
请求与保持条件:一个进程在持有至少一个资源的同时,又请求其他进程占用的资源。
不可剥夺条件:已经分配给一个进程的资源不能被强制性地剥夺,只能由持有该资源的进程主动释放。
循环等待条件:存在一个进程资源的循环链,每个进程都在等待下一个进程所占用的资源。当这四个条件同时满足时,就可能发生死锁。
确定网络地址:子网掩码通过将IP地址中的网络部分与主机部分进行分隔,将网络地址和主机地址进行划分。子网掩码中的1表示网络部分,0表示主机部分。通过与IP地址进行逻辑与运算,可以得到网络地址。
确定主机地址范围:子网掩码中的0表示主机部分,确定了主机地址的范围。主机地址范围是指在同一个网络中可以分配给主机的不同IP地址。子网掩码中主机部分的位数决定了主机地址的数量,可以根据主机地址范围来分配IP地址给不同的主机。
B树:是一种平衡多路搜索树,每个节点可以存储多个关键字和对应的数据指针。节点分为内部节点和叶子节点,内部节点存储关键字和指向子节点的指针,叶子节点存储关键字和对应的数据指针。所有叶子节点都在同一层级上,通过内部节点的指针可以快速定位到叶子节点,适用于磁盘存储等场景,可减少磁盘I/O次数,提高检索效率。
B+树:在B树的基础上改进,所有关键字都存储在叶子节点上,内部节点只存储关键字和指向子节点的指针。叶子节点之间通过指针连接形成有序链表,可支持范围查询和顺序遍历。内部节点相对较小,能存储更多关键字,减少树的高度,提高检索效率,常用于数据库索引的实现,支持高效的范围查询和排序操作。
分片方式:将数据按照一定规则(如哈希算法)分配到不同节点上,每个节点负责存储和处理一部分数据。
好处:
扩展性:增加节点可线性扩展集群存储和处理能力,提高系统吞吐量和并发性能。
负载均衡:数据分散存储在多个节点上,均衡每个节点负载,避免单个节点成为瓶颈,提高系统稳定性和可用性。
容错性:某个节点故障或宕机时,其他节点仍可继续提供服务,保证系统可靠性和持久性。
高可用性:通过复制机制,每个分片有多个副本,主节点故障时可自动切换到备用节点,实现高可用性。
内存分布:
方法区:存储类的结构信息,如类的字段、方法、常量池等。JDK 8及之前称为“永久代”,JDK 8及之后改为使用元空间(Metaspace)存储。
堆:存储对象实例,是Java程序中最大的一块内存区域,被所有线程共享。堆被划分为新生代(Young Generation)和老年代(Old Generation)两部分,新生代又分为Eden空间和两个Survivor空间。
虚拟机栈:每个线程运行时创建一个栈,存储局部变量、方法参数、返回值等。栈中的每个栈帧对应一个方法调用,包括方法的局部变量表、操作数栈、动态链接、方法返回地址等。
本地方法栈:与虚拟机栈类似,但用于执行本地方法(Native Method)。
程序计数器:记录当前线程执行的字节码指令的地址。
垃圾回收区域:主要发生在堆和方法区(或元空间)中。堆中垃圾回收器自动回收不再被引用的对象,释放内存空间;方法区(或元空间)中主要针对无用的类和常量进行回收。不同垃圾回收器工作方式和策略不同,如串行回收器、并行回收器、并发回收器等。
实现方式:
基于代理的经典AOP:
JDK动态代理:基于接口的代理,通过java.lang.reflect.Proxy类和InvocationHandler接口实现。Spring使用JDK动态代理来代理实现了接口的目标对象。
CGLIB动态代理:基于继承的代理,通过CGLIB库生成目标对象的子类来实现代理。Spring使用CGLIB动态代理来代理没有实现接口的目标对象。
基于字节码的AspectJ AOP:AspectJ是一个独立的AOP框架,提供更强大和灵活的AOP功能。Spring可集成AspectJ,使用AspectJ注解或XML配置定义切面和切点,然后通过编译时或运行时的织入方式将切面织入到目标对象中。
工作原理:在Spring中,通过配置文件或注解定义切面和切点,使用AOP代理将切面织入到目标对象的方法中。当目标对象方法被调用时,AOP代理在方法执行前、执行后或抛出异常时执行切面相关逻辑,实现横切关注点功能,如日志记录、事务管理等。
过期删除:Redis使用过期删除策略处理过期键,当一个键的过期时间到达时,Redis会在键被访问时检查它是否过期,并在访问时删除过期的键。这种方式确保了过期键在被访问时被删除,但可能导致一些性能开销。
内存淘汰策略:当Redis内存使用达到上限时,需要淘汰一些键释放内存空间。常见内存淘汰策略有LRU(Least Recently Used,淘汰最近最少使用的键)、LFU(Least Frequently Used,淘汰最不经常使用的键)、Random(随机选择要淘汰的键)、TTL(Time To Live,淘汰具有最早过期时间的键)。可通过配置Redis的maxmemory-policy参数选择所需内存淘汰策略,默认情况下Redis使用noeviction策略,即不淘汰任何键,当内存使用达到上限时,写操作会报错。