• 基础知识集合


    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博客

    循环依赖:提前暴露引用

    1. /**创建好的对象 实例化 属性设置 初始化Cache of singleton objects: bean name to bean instance*/
    2. private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
    3. /**半成品对象Cache of early singleton objects: bean name to bean instance. */
    4. private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
    5. /**构造bean对象的lambda表达式,bean对象创建工厂Cache of singleton factories: bean name to ObjectFactory.(被代理的)对象 */
    6. 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()

    newFixedThreadPool只创建核⼼线程

        nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()

    newSingleThreadExecutor

       1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()

    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

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

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

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

    安全验证 - 知乎

    linkedHashMap

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

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

    1. K key;
    2. V value;
    3. Entry<K, V> next;//HashMap指定table位置上(链表)连接的Entry
    4. int hash;
    5. Entry<K, V> before;
    6. NEtry<K, V> after;
    7. //链表的头结点 入口节点不存数据
    8. private transient Entry<K,V> header;
    9. //该属性指取得键值对的方式,是个布尔值,false表示插入顺序 默认,true表示访问顺序,也就是访问次数.
    10. 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博客

  • 相关阅读:
    CIS基准测试工具kube-bench使用
    【DeepLearning】【PyTorch 】PyTorch 损失函数封装中 size_average、reduce 和 reduction 三个参数的意义
    打印整数二进制的奇数位和偶数位
    而立之年才感悟到的一些箴言(二)
    JOSEF约瑟 JD3-40/23 JD3-70/23漏电继电器 AC220V\0.05-0.5A
    麒麟桌面系统CVE-2024-1086漏洞修复
    Spring中Bean的作用域
    冥想第四百九十三天
    两个难搞的Java Error/Exception
    信任营销已成为产品消费蓝海,开利网络与合作伙伴共建信任营销闭环
  • 原文地址:https://blog.csdn.net/ma15732625261/article/details/137974234