笔记

redis
数据恢复 AOF 与RBD 两种啊
RBD是存的快照,所以一般是5-10会一次快照。
缺点会丢失部分数据数据,优点数据执行效率快,适合灾备恢复
AOF是日志文件,记录所有的操作命令
优点是数据丢失量少,缺点数据恢复耗时比较长


redis数据结构
压缩列表 一块连续的内存地址,用于节省内存, 类似于数组。
所以他的有点是内存节省,
缺点: 1.大数据量的时候查询效率会变低
2.内存空间不足时,可能需要重新分配内存,可能有连锁更新的问题
连锁更新问题:
主要时压缩列表的每个节点都需要记录前一个节点的长度, 当新增或者删除的对象的大于254字节的时候会引发记录字节长度的属性的内存由1字节变成了5个字节,从而可能导致该节点内存不足需要重新分配,
从而导致后面所有的对象需要连锁更新,并不断重新分配内存。
但该问题触发条件比较难,只有连续的节点字节长度在250-253之间才会发生,现实中不容易触及。

String int,embstr,raw
hash (压缩列表(数组)+Hash)数组+链表
结构类型类似与hashmap (压缩列表)
List 双向链表( quicklistNode)和压缩列表
保存一个元素的时候,数据是在双列表中记录压缩列表的指针,元素保存在压缩列表中。 插入元素的时候如果当前压缩列表不能容纳则新建压缩列表, quicklistNode会控制压缩列表的大小或者元素个数,(减少连锁更新的风险)。
set 哈希表或整数集合
当元素全部都是整数的时候,用整数集合,否则用hashtable实现。(类似hashmap)
zset 压缩列表和跳表。比set增加了权重,可以排序


redis 6.0之后支持了多线程,但是这个多线程是多线程io流读取和数据解析,但是执行命令还是单线程

 


kafka零拷贝技术
正常的数据拷贝
从硬盘->内核空间-应用空间->内核空间->网卡 四次拷贝
零拷贝技术是指不经过应用空间,直接由内核空间网网卡写,java本身也支持零拷贝 fileChannel
简单理解拷贝底层直接调用liunx的相关方法,不经过应用内存空间,直接往网卡写

 

JVM内存模型
堆 java虚拟机中内存最大的一块区域。主要存的是对象实例。垃圾回收机更多的是对于堆中内存清理。
栈 每一个线程都会创建一个虚拟java栈,所以这块是线程私有的。 执行方法的时候,会创建一个栈帧,栈中维护的是一些局部变量(比如方法参数),操作栈数等。所以方法里面的参数是线程私有的,是线程安全的。
方法区 线程共有的一块区域。class类加载,常量池,静态变量这些。 所以这块其实也是线程共有的一些数据。
本地方法区 本地方法区则是为虚拟机使用到的Native 方法服务。 也有可能出现内存溢出的问题。
程序计数器 下一次执行的字节码指令,JVM为了支持多线程,会给每个线程配置程序计数器,所以这线程独有的。 程序计数器内存占用很少,不会出现内存溢出。

 

spring容器启动
JVM重启顺序
1. 首先会加载class类到方法区,这里会用到一个双亲委派模型的方式去加载class。class文件中还包含常量池信息于静态变量这些信息,也会维护到方法区中
2. spring容器启动,会在堆中去划分一块内存区域,去创建一个spring容器
3. 根据配置的扫包路径,运用反射的原理去创建对象,然后用JDK动态代理去创建一个代理对象,维护到spring容器 (ioc),代理对象执行方法的时候,允许增强,比如事务,日志等等(aop)
4. JVM运行过程中,会有垃圾回收机制,对于jvm的堆内中的不同区域的内存进行内存释放(垃圾回收机制)
5. 当请求进来的时候,会分配一个线程,jvm会为这个线程配置一个程序计数器,而程序计数器会记录下一次执行的字节码,同时栈中创建一个java虚拟栈,然后去执行一个个方法,每个方法维护一个栈帧,
每个栈帧会维护方法参数,返回信息这些。 (所以方法的入参是线程安全的)。也是因为这个原理,jvm是支持多线程的。

posted @ 2022-08-26 16:28  火羽  阅读(29)  评论(0编辑  收藏  举报