基础知识集合

https://blog.csdn.net/sheng_q/category_10901984.html?spm=1001.2014.3001.5482

字节流:面向字节的io流,音频 图片 歌曲

byteArray/stringbuffer/file/piped/sequence /filter/data/buffer缓冲/lineNumber/pushedbackInputStream

byte/file/piped/filter/data/print/bufferedOutputStream

reader/writer:字符流 2个字节的Unicode字符 需要缓冲区, 转成字节放入硬盘

io

nio:同步非阻塞 多路复用基础

异步:用户进程read操作 去做其他事情 ,内核角度asynchronousread后 立刻返回,内核等待数据准备好 拷贝到用户内存 ,内核给用户发送signal

同步/异步:消息通信机制,发起调用等待结果

阻塞/非阻塞:等待调用结果时的状态,阻塞 结果返回之前会被挂起 得到结果才会返回

reactor:同步io 事件分离器 等待文件描述符 /socket读写操作准备就绪,处理器具体操作

proactor:异步io 是处理器也是分离器,io交给操作系统:数据缓冲区地址 数据大小

异步情况下(Proactor),当回调handler表示I/O操作已经完成;

同步情况下(Reactor),回调handler表示I/O设备可进行某个操作(can read or can write)

BIO:

同步阻塞,while循环服务端accept等待接收,接收到套接字上读写请求,不再接受其他的请求

NIO:

基于Reactor,有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的

事件驱动/避免多线程/单线程多任务/非阻塞IO /基于block传输/零拷贝/io多路复用

零拷贝:

fileChannel:transferTo transferFrom

通道交叉连接到另一个通道,DMA文件内容复制到内核读缓冲区,数据从这个缓冲区复制另一与socket输出相关的内核缓冲区中,第三次复制DMA把socket关联的缓冲区中的数据复制到协议引擎上发送到网络上

优化:

transferTo数据复制到内核缓冲区,描述符追加到socket关联的缓冲区中,DMA将缓冲区中数据传输给协议引擎

ServerSocketChannel:监听tcp连接SocketChannel

SocketChannel:连接tcp套接字的通道

AIO:

有流可读,可读流传入read方法的缓冲区,通知应用程序

select和epoll:select posix标准,epoll上linux

select句柄数目受限,最多1024个 ;epoll没有 限制最大的打开文件句柄数目

epoll不会随fd数量增长而降低效率,select轮询 数组,epoll队列 只操作活跃socket(callback)

解决:io多路复用,描述符列表 调用函数 直到其中一个准备好才返回, 告诉进程哪些IO就绪

NIO技术概览 | Idea Buffer

epoll

事件驱动的I/O模型,同时处理大量的文件描述符

内核与用户空间mmap共享一个事件表:监控的文件描述符以它们的状态,当状态变化,内核将事件通知给用户空间,用户空间根事件类型进行相应的处理

epoll_create(内核空间)创建文件描述符epfd

ep_alloc建初始化eventpoll

eventpoll:被监听socket列表rbr(epitem)/等待队列wq/就绪socket列表rdllist(wait方法从其取)

epitem:红黑树rbn/rdllink就绪列表/ffd引用描述符/pwqlist等待队列/eq含当前的eventpoll对象指针/event感兴趣的事件和源fd

anon_inode_getfd把wventpoll映射到文件描述符

epoll_ctl:添加或删除要监听的socket(到epfd)

epoll_wait等待数据

bean实例化与依赖注入

属性注入:javaBean中存在默认构造函数 设置方法

Spring系列-3 Bean实例化与依赖注入_实例化包括属性注入嘛-CSDN博客

循环依赖:提前暴露引用

复制代码
/**创建好的对象 实例化 属性设置 初始化Cache of singleton objects: bean name to bean instance*/
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

/**半成品对象Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

/**构造bean对象的lambda表达式,bean对象创建工厂Cache of singleton factories: bean name to ObjectFactory.(被代理的)对象 */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

三级缓存作用

如果需要代理 初始化阶段的aop提前至属性设置阶段,引入this.earlyProxyReferences标志(map)

lambda表达式并执行获取代理对象

二级缓存作用

第一次通过lambda表达式得到代理对象,将代理对象存入二级缓存并删除三级缓存

第二次直接从二级缓存中查询,而不需要再次执行lambda表达式

inject:

根据beanName等信息获取待注入的值; 通过反射完成属性注入

国际化

Locale类国际化类型,包含国家和地区

准备国际化文件:资源名_语言_国家/地区.properties(只能含ASCII字符)

refresh()的步骤中存在initMessageSource()

springboot 通过spi spring.factories中MessageSourceAutoConfiguration @ConditionalOnMissingBean

复制代码
JsonDeserializer 自定义 

高并发优化:

高并发扣减库存:

提交订单-库存,支付时效,超过自动取消订单 还原库存

token校验/防多次刷单 拉黑/ redis先操作 扣减库存 支付的时候再实际扣减库存

扣减明细 流水 / 缓存扣减 / 扣减库 +MQ

定期检查redis/数据库 一致性; 异步更新缓存canal

https://blog.csdn.net/sheng_q/category_10901984.html?spm=1001.2014.3001.5482

线程池:

corePoolSize:核心

maximumPoolSize 核心+非核心

threadFactory工厂:释放守护/优先级

blockingQueue:

  • LinkedBlockingQueue链式阻塞队列Integer.MAX_VALUE,无限创建队列
  • ArrayBlockingQueue数组阻塞队列,需要指定队列的⼤⼩
  • SynchronousQueue同步队列,内部容量为0,每个put操作必须等待⼀个take操作
  • DelayQueue延迟队列,当其指定的延迟时间到了,才能够从队列中获取到该元素

rejectedExecutionHandler拒绝策略:

  • AbortPolicy丢弃任务并抛RejectedExecutionException异常
  • DiscardPolicy丢弃新来的任务
  • DiscardOldestPolicy丢弃队列头部(最旧)任务 重新尝试执⾏程序(如果失败,重复此过程)
  • CallerRunsPolicy调⽤线程来处理该任务

newCachedThreadPool 很多短时间的任务时,线程复⽤率⽐较⾼,非核心线程 先入队

0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>()

newFixedThreadPool只创建核⼼线程

nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()

newSingleThreadExecutor

1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()

newScheduledThreadPool定⻓线程池,⽀持定时及周期性任务执⾏

corePoolSize, Integer.MAX_VALUE, DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS, new DelayedWorkQueue()

【多线程】线程池里边都有些什么东西呢_当队列满了,核 线程空闲、扩展线程也空闲,谁从队列 获取?-CSDN博客百度安全验证

object.finalize在垃圾收集器删除对象之前对这个对象调用的

SynchronousQueue: 公平内部TransferQueue队列:头尾两个指针队尾匹配队头出队,先进先出

非公平TransferStack栈,head指针 CAS

跳表:结点可含很多个指向后续结点的指针,可跳过不必要结点,加快查找、删除等。链表内每一个结点包含多少个指向后续元素的指针,通过一个随机函数生成器得到

concurrentHashMap:

java1.7与1.8

1.7 switch支持字符串,catch可分配更多空间 自动释放资源

1.8 lambda表达式 stream流 函数式编程

collection

list/set/map:

hashset:可null 基于hashmap 非线程安全

linkedHashset:继承hashset 可null linkedHashSet有linkedhashmap 双向链表和hashmap 非安全

treeset:不null treemap 红黑树 次序,非安全

自然排序:comparable ;比较排序java.util的comparator

list:有序 🉑️重 ,顺序索引

arraylist:可null 数组实现 动态增长/再分配object数组 非线程安全

linkedlist:可null 双端链表 队列和栈 ,deque继承queue 非线程安全

stack 继承vector 模拟栈 先进后出 线程安全

queue:FIFO 新元素插入到队尾 访问元素返回队头

priorityQueue:不null 二叉堆底层,队列大小重新排序

arrayDeque:基于数组双端队列,arraylist类似 底层动态/可重分配object数组存储集合元素

map:映射关系

hashmap:1.7 散列表+链表,1.8散列表+链表+红黑树 非线程安全

linkedhashmap:继承hashmap,双向链表+hashmap 非线程安全

treemap:sortedMap,红黑树 非安全

hashtable 线程安全

ArrayList和LinkedList:

arraylist动态数组,随机访问get/set,指定位置插入 arraycopy耗时

linkedList双向链表,for循环获取元素,index<size/2,左边查 否右边查

数据量大 插入数据 arraylist优势大 特别是后面位置查入

java集合框架05------ArrayList和LinkedList的区别-CSDN博客

Kunbernetes(k8s)的基本概念详解+部署_kuburnetes-CSDN博客

安全验证 - 知乎

linkedHashMap

双向链表,有序;key value容许为空 ;key被覆盖 value可重复 ; 非线程安全

HashMap 操作数据结构 +LinkedList 维护插入元素顺序

复制代码
K key;
V value;
Entry<K, V> next;//HashMap指定table位置上(链表)连接的Entry
int hash;

Entry<K, V> before;
NEtry<K, V> after;

//链表的头结点 入口节点不存数据
private transient Entry<K,V> header;
//该属性指取得键值对的方式,是个布尔值,false表示插入顺序 默认,true表示访问顺序,也就是访问次数.
private final boolean accessOrder;

accessOrder=false,put 新元素加入哈希桶 加入双向链表末尾

accessOrder=true,put新元素 哈希冲突 key同替换 双向链表尾部 超过上限removeEldestEntry返true 删除最早元素 方便新元素插入,无冲突放入 加入双向链表尾部,get到的元素添加双向链表尾部

LRU:最久未访问header指向的元素,继承linkedhashmap重写removeEldestEntry设置缓存大小

Java基础汇总(十六)------LinkedHashMap-CSDN博客

LinkedHashMap的底层原理_linkedhashmap底层-CSDN博客

红黑树

平衡二叉查找树,节点非红即黑,根节点/叶子节点黑色

红色节点必须有两个黑色子节点,任一节点到叶子节点含相同数目的黑色节点

安全验证 - 知乎

事务原理 aop 动态代理

mybatis 读取mybatis.xml配置文件 configuration

映射关系:mapper.class 代理工厂

enviroment 数据库环境 datasource /事务工厂JdbcTransaction ManagedTransaction/连接池

其他信息:xml配置文件的其他信息

当用户以目标对象类型从IOC获取Bean对象时, 得到的是代理对象; 当调用目标对象的方法时, 被增强器TransactionInterceptor所拦截, 并进入invoke方法

虚拟内存:

内存页struct page 4k,调度以页为单位进行,mem_map管理,虚拟内存 struct mm_struct 物理内存映射,pgd属性中(物理)页的起始地址(fork进程时创建自己独立页表mm_struct)

每个进程的虚拟内存空间相互隔离,有属于自己的页表,管理虚拟内存空间映射关系 访问物理内存的权限

PTE 保存了进程虚拟内存空间中的虚拟页与物理内存页的映射关系,以及控制物理内存访问的相关权限位,内核先从虚拟内存地址中提取出 页表内偏移 ,根 页表起始地址 + 页表内偏移 * sizeof(PTE) 获取到该虚拟内存地址所在虚拟页在页表中对应的 PTE 了

一步一图带你构建 Linux 页表体系 ------ 详解虚拟内存如何与物理内存进行映射_虚拟内存 页表 物理内存-CSDN博客

相关推荐
Wnq100724 小时前
智能巡检机器人在化工企业的应用研究
运维·计算机视觉·机器人·智能硬件·deepseek
tf的测试笔记6 小时前
测试团队UI自动化实施方案
运维·自动化
TDD_06287 小时前
【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
linux·运维·经验分享·centos
头孢头孢7 小时前
k8s常用总结
运维·后端·k8s
遇码7 小时前
单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
大数据·运维·分布式·开源·定时任务·dolphin·scheduler
爱编程的王小美7 小时前
Docker基础详解
运维·docker·容器
学习至死qaq8 小时前
windows字体在linux访问异常
linux·运维·服务器
IEVEl8 小时前
Centos7 安装 TDengine
运维·centos·时序数据库·tdengine
在野靡生.9 小时前
Ansible(4)—— Playbook
linux·运维·ansible
烨鹰9 小时前
戴尔电脑安装Ubuntu双系统
linux·运维·ubuntu