1. CPU缓存与性能优化

https://blog.csdn.net/Yobol2016/article/details/105897507/

CPU缓存

cpu上一般有三级缓存,一二级在各自cpu核上,三级缓存是共享缓存
数组比链表查询速度快是因为 cpu一次内存寻址会加载一片连续的内存空间,比链表寻址次数少

2. 内存池:如何提升内存分配的效率?

https://time.geekbang.org/column/article/230221

内存池

内存池分为应用内存池和C库内存池(JVM层, 如Ptmalloc2(linux默认)和TCMalloc)
内存池在申请内存的时候会多申请一些内存, 用来加快后续内存申请的速度, 所以java程序的内存大小会超出Xmx的值

3.开放寻址法VS链表法

https://blog.csdn.net/qq_29066329/article/details/94716326

哈希 包含 开放寻址法 链表法

解决hash冲突的方法
开放寻址就是如果冲突了就 hash(str, n) n+1, 找下一个hash的位置, 优点是可以利用数组遍历速度快的优势和内存mmap映射文件来备份数据,
但是需要另外引入数组来存放实际数据(可以使用定长header,变长body来存放不定长数据),hash表中只存索引

4.牛人解释哈希的开放寻址法

https://www.it610.com/article/5572260.htm

开放寻址法

解决hash冲突就和找厕所坑位一样

5.如何用哈希表管理亿级对象?

https://time.geekbang.org/column/article/232351

开放寻址法

极大量hash数据的时候需要考虑容灾, 此时开放寻址法更好

6.sendfile“零拷贝”、mmap内存映射、DMA

https://www.jianshu.com/p/7863667d5fa7

零拷贝 包含 mmap sendfile

sendfile 四次拷贝 mmap使用了DMA技术只要三次拷贝
mmap 将文件直接映射到内存中,用户空间可以共享内核空间数据, sendfile不可以

7.零拷贝:如何高效地传输文件?

https://time.geekbang.org/column/article/232676

sendfile 包含 DMA

DMA指的是网卡支持SG-DMA, 可以减少cpu操作 pagecache拷贝到socket缓冲区, 而是由 DMA控制器直接从pagecache发送到网卡上

零拷贝 关联 pagecache socket缓冲区

因为粘包拆包 socket缓冲区可用大小并不固定, 而用户态缓冲区大小是固定的. 但零拷贝可以直接把数据扔进socket缓冲区,无需关心socket缓冲区的大小,直接塞满,效率更高.
同时因为文件数据连续的原因,所以pagecache预读数据更能提高零拷贝的速度.
但大文件发送的时候使用零拷贝和pagecache可能会导致独占资源 热点小文件变慢.

8.深入浅出java常量池

https://www.cnblogs.com/syp172654682/p/8082625.html/details/88887663

静态常量池 关联 运行时常量池

静态常量池: 每一个class文件中包含的字面量和符号引用
运行时常量池: class文件被加载进JVM时, 将静态常量池中的字面量和符号引用加载进方法区,且允许动态添加,如使用String.itern进入运行时常量池

静态常量池 包含 字面量 符号引用

gc堆 包含 Metaspace

Metaspace在 GC堆中,可以被gc

Metaspace 关联 方法区

jdk8后用Metaspace替代了方法区


9.面试题系列第5篇:JDK的运行时常量池、字符串常量池、静态常量池,还傻傻分不清?

https://www.cnblogs.com/secbro/p/13586435.html

常量池 包含 运行时常量池 字符串常量池 静态常量池

静态常量池: 编译阶段,存放在class文件中的字面量和符号引用, 这些数据后续将存放在运行时常量池
字符串常量池: 方法区的一部分,存放类的信息,每个类在加载进JVM后,将符号引用替换成直接引用

10.JVM常量池主要分为Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池

https://cloud.tencent.com/developer/article/1450501

常量池 包含 运行时常量池 字符串常量池 静态常量池 包装类对象常量池

静态常量池(class文件常量池) , class文件中 Constant Pool 部分
运行时常量池 多个类共用一个常量池,多个类中相同的常量只保存一份
字符串常量池 String字面量会在方法区中存放一个引用, 再在堆上创建实例
包装类对象常量池 默认 [-128 127] Byte Long Integer Boolean Character 在哪儿不知道,目测和字符串一样

字面量

包含 字符串如: String s = “abc”中 “abc”;final修饰的成员变量(静态变量 实例变量 局部变量)

符号引用 包含 全限定名 简单名称 描述符

全限定名 如 JavaBasicKnowledge/JavaBean, java/lang/String
简单名称(字段名称, 方法名称) 如 private String a =”abc” 中的 “a” 和方法test中的”test”

11.消息队列之事务消息,RocketMQ 和 Kafka是如何做的?

https://mp.weixin.qq.com/s/En-oxQ6blsFne1HATkAXuw

分布式事务 关联 Kafka RocketMQ

rocketmq使用半消息保证业务系统和消息队列的事务性
kafka 使用2pc保证 一个kafka事务内多个消息发送的事务行, 并不能关联业务

12.全限定名、简单名称和描述符是什么东西?(转)

https://www.cnblogs.com/wxdlut/p/12229562.html

描述符 包含 字段描述符 方法描述符

字段描述符 基本类型用一个大写字母如(I 代表 int Integer) 对象用 L+全限定名,如 Ljava/lang/String,数组用 [ + 字段描述符 如 [[Ljava/lang/String
方法描述符 (参数列表)返回值 如: Object m(int i, double d, Thread t) -> (IDLjava/lang/Thread;)Ljava/lang/Object;

13.符号引用和直接引用

https://www.jianshu.com/p/33d7495f9253

直接引用 关联 符号引用

符号引用就是class文件中一个描述变量的符号变量,
直接引用是 内存中指向对象的指针(或偏移量或数组),在类加载链接-解析阶段替换符号引用得来

类加载 关联 直接引用

直接引用是在类加载链接-解析阶段替换符号引用得来

14.SynchronousQueue

https://www.jianshu.com/p/d5e2e3513ba3

SynchronousQueue

一个只有一个元素的blockingqueue

15.java集合(五)Queue集合之PriorityBlockingQueue详解

https://www.cnblogs.com/yuexiaoyun/p/12203101.html

PriorityBlockingQueue

priorityBlockingQueue 是每次出队的都是优先级最高的队列, 内部使用 堆(一种平衡二叉树)实现

16.Java并发编程之LinkedTransferQueue阻塞队列详解

https://blog.csdn.net/qq_38293564/article/details/80593821

LinkedTransferQueue

使用预占模式,特点是消费线程取数据时, 有数据时就取走,没有数据就生成一个null节点,并阻塞当前线程,若有新数据来时就直接给该线程,不需入队.
使用了大量无锁编程

17.使用delayedQueue实现你本地的延迟队列

https://www.jianshu.com/p/87fd5b9f5ffb

delayQueue

delayqueue 组合了priorityqueue, 队列中的元素需要实现delayed接口, 并按照优先级排好. 获取元素时,只能取走delayed到期了的元素, 是一个无界队列

18.ConcurrentLinkedDeque和ConcurrentLinkedQueue

https://blog.csdn.net/weixin_42245930/article/details/88661020

非阻塞队列 包含 ConcurrentLinkedDeque ConcurrentLinkedQueue

concurrentlinkeddeque是 双向链表, 支持FILO和FIFO
concurrentlibkedqueue是 单向链表, 支持FIFO
他们的内存一致性遵循 插入happen-before于 访问和删除

19.并发容器-ConcurrentLinkedQueue详解

https://www.jianshu.com/p/231caf90f30b

阻塞队列 关联 ConcurrentLinkedQueue

阻塞指的是在 入队和出队的时候加锁来保证并发. 且 无法插入(有界队列满), 没有数据可取(队列为空或不符合要求,如:delayqueue未到时间)阻塞生产者线程或消费线程
ConcurrentLinkedQueue(包括其他并发线程)使用CAS来控制出队,入队的并发.

20.java并发面试常识之copyonwrite

https://www.jianshu.com/p/afc6e0ae08b0

copyonwrite 包含 copyonwritearraylist copyonwritearrayset

增删改容器时复制当前容器,修改完后替换原容器, 但若同时有多线程进行修改操作,也是需要加锁滴

21.图解LinkedHashMap原理

https://www.jianshu.com/p/8f4f58b4b8ab

hashmap 包含 linkedhashmap

linkedhashmap继承自hashmap, 在原有基础上增加双向链表来增加有序性

22.synchronized实现可见性

https://www.cnblogs.com/xuwenjin/p/9044230.html

synchronized 关联 可见性

jmm对于synchronized的规定包含:
1.线程解锁前需要把共享变量写入主内存
2.加锁时需要清空工作内存中的共享变量的副本,使得可以从主内存读取