- Redis集群为什么16384,如何进行扩容,节点如何通信
- 热榜功能设计
- Kafka生产重平衡有什么问题,如何保证重启不发生重平衡
- Kafka为什么都由leader副本进行读写
- arraylist为什么加transient,和linkedlist区别,分别在什么场景下使用
- ES脑裂
- while(true){new Thread().start()}
- redis因网络原因超时还会执行成功吗
- 反射原理
- CMS为什么是标记清除,内存碎片怎么解决
- a+b操作数栈过程,返回地址什么时候回收,程序计数器什么时候为空
- 为什么Linux要分用户态和内核态
- CFS调度方式
- Java序列化为什么要实现接口,序列化号的作用是什么
- Kafka如何保证消息不丢失,为什么要设计分区
- 编写多线程代码
- Java NIO及其零拷贝
[x] 多级页表的作用
Redis集群的哈希算法是CRC16共65535位,但是在集群的通信过程中都会带上一个消息头,消息头包含每个每个节点占用的槽位,如果是65535共8K的消息,比较大,并且节点不能超过1000个,所以16384足够1000个节点;另外;但槽位太少,散列效果就不会太好,最终选择了16384个槽位;扩容缩容只需要对哈希槽的迁移,不会对服务造成不可用;节点通信方式:https://www.fushengwushi.com/archives/1646
- 热榜功能设计:https://segmentfault.com/a/1190000039320528,考虑并发量和基础功能(热度增加,范围查询,单值查询),可以使用主从复制提供并发能力,如果是数据量大可以考虑哈希分片,查询的时候每个节点查询在进行聚合
- Kafka重平衡https://blog.csdn.net/qq_21383435/article/details/108720155,对生产环境TPS会造成较大的影响,要是节点比较多的话会耗费小时以上;避免重平衡,适当增大超时时间,减少心跳频率,还有一个消费者两次拉取消息的间隔如果过大也会被提出消费者组。什么是重平衡,重平衡的原因,如何避免重平衡
- Kafka为什么不支持读写分离:https://blog.csdn.net/qq_42046105/article/details/89368978,可能出现较大的数据一致性问题,否则就要有一定的延时,而且Kafka这种类型是读写都比较多的。读写分离是为了什么,由读写分离造成的问题,1.数据一致性 2.延迟,而且读多写少场景也分摊不了太多的负载;而且topic不均衡,生产者写入,消费者消费,leader分布不均匀也会造成负载集中
- Kafka为什么使用分区:1. 磁盘IO是Kafka的处理瓶颈,通过分区增加机器来实现水平扩展和处理能力;2. 增加并发度;3. 分区内消息顺序处理。一个分区只能被一个消费者消费因为Kafka是基于拉模式,通过该方式保证消息有序性,以及出于分担负载提高效率来考量
- transient表示被修饰的对象不能被序列化,本质是希望只序列化实际存储的元素而不包括空数组,通常实现了Serializable接口会采用默认方式进行序列化,如果在类中定义了writeObject就会调用该方法进行序列化;两个list底层的数据结构,arraylist删除元素需要移位,linkedlist查找元素需要遍历整个list, modCount对应的快速失败和安全失败,快速失败是每次遍历都会检测预期count与当前count是否一致,安全失败使用写时复制方式实现。之所以有快速失败因为在迭代时元素增加修改可能会发生错误,所以预先报错
- ES脑裂:ES集群本身需要master管理集群状态和索引新增(数据节点本身可以作为master节点),可能原因网络问题,master与data节点未分离压力过大时master停止响应,增加超时判断时间,以及增加master最少的合格节点
- 不停创建空线程应该会增加一点CPU压力,但由于是空线程很快就结束,所以并不会造成无法运行,垃圾回收会增加因为有大量的无效线程对象
- redis超时可能会断开连接不会执行命令
- 反射是在运行时获取类/对象的属性以及调用其方法,通过加载的Class对象获取类的信息。反射动态解析类型,无法使用JIT编译优化,并且需要在运行时进行原来编译期做的类型检查校验(安全检查,访问控制)
- 因为CMS并发清理用户线程还在使用无法进行整理,需要下一次的full GC来清除。但是也有办法,开启选项后会长时间STW来进行整理,
- JVM操作数栈过程:变量a、b分别压入操作数栈中,然后将变量值读取到局部变量表,再从局部变量表load回到操作数栈执行iadd,结果存入局部变量表;JVM程序计数器如果执行navite方法则为undefine,因为计数器只记录虚拟机字节码指令的地址,通过原生寄存器执行,执行完回到被调用的地址
- ring0与内核态:CPU指令集被划分为4个级别的ring来控制不同级别的权限,因为有些执行操作失误可能会导致影响计算机系统,linux只有ring0和ring3,对应的就是内核态和用户态
- Java序列化:https://juejin.cn/post/6844903848167866375,实现接口只是一个标识可序列化语义,因为并不是所有对象都需要进行序列化;同一个对象通常只会序列化一次;静态变量和transient变量不可被序列化;如果需要自定义,则重写writeObject方法;序列化版本号是为了保证两个不同的JVM序列化和反序列化时class版本一致,不一致在反序列化时会报错如果不定义会有字段和方法自动生成,保持版本号可以兼容不同版本的class文件
- 线程池Future.get方法报错,后续是无法执行的;
- Java NIO:Java提供了Buffer缓冲区(相当于用户缓冲区),Channel连接(相当于内核socket缓冲区),Selector非阻塞连接监听器给开发者实现NIO,其本质还是poll/epoll(基于操作系统底层实现),selector.select如果没有就绪的Channel则会阻塞;但NIO本身还有一些问题,如果想最大化利用性能,还需要基于Reactor线程模型,这部分就是Netty的实现。NIO零拷贝,
MappedByteBuffer就是基于mmap的实现,DirectByteBuffer就是前者的具体实现类;FileChannel则会尝试先使用sendfile,如果不支持则使用mmap方式。Kafka使用的是sendfile方法 - 多级页表,顶级页表必须全部加载否则无法定位物理内存位置,而多级页表的顶级页表只要一个内存页4KB即可,而非顶级页表只需要用的时候才加载,所以可以大量节省内存https://www.polarxiong.com/archives/%E5%A4%9A%E7%BA%A7%E9%A1%B5%E8%A1%A8%E5%A6%82%E4%BD%95%E8%8A%82%E7%BA%A6%E5%86%85%E5%AD%98.html
