1. CMDB&ITMP使用了Dubbo,分布式事务是怎么处理的

    1. 每个API都有对称操作的API,单个API实现事务

    2. 存储方式是MySQL+ES,ES不支持事务,先对MySQL操作后,再对ES操作,发生异常时可自动对MySQL回滚。

    3. 对于多个API调用的事务,采用事务补偿机制,发生异常后,按执行成功API的相反顺序,调用对称的操作回滚数据。

  2. Redis的部署模式

    1. 单机部署

    2. 主从部署

    3. 哨兵部署

    4. 集群部署

  3. Mysql锁有哪些类型

    1. 按锁粒度,分为:行锁、表锁、元数据锁

    2. 行锁按兼容性:共享锁(Shared Lock)、排他锁(Exclusive Lock)

    3. 行锁按模式:记录锁、间隙锁(开区间)、临建锁(左开右闭,记录锁+间隙锁)、插入意向锁(一种间隙锁,但多个插入意向锁之间不互斥)

    4. 表锁有:意向共享锁(IS Lock)、意向排他锁(IX Lock)

    5. 元数据锁:共享锁、排他锁,锁兼容类似行锁,对表数据进行操作时,会加共享锁,对表结构进行修改时,会加排他锁

  4. insert into t1 select * from t2 这条sql会不会加锁

    1. 会对t2表直接加上表锁,如果对t2表使用了主键排序,则按照扫描顺序,逐步对记录加锁,否则会直接对全表加锁

    2. t1表走正常插入锁,有自增键时加自增锁(表级),否则插入意向锁。

  5. ConcurrentHashMap怎么实现线程安全的

    1. jdk1.8以后的版本中。

    2. 存储一个节点数组,每个节点是一个Hash槽。

    3. Hash槽内是相同Hash值形成的链表或者红黑树,链表元素达到临界点(8个元素)后转为红黑树,元素小于临界点时(6个元素)回归链表。(红黑树节点继承自链表节点实现)

    4. 读取时,会对table字段做快照,方式其他线程将table更新为迁移完成的nextTable。

    5. 写入或者移除时,都是在循环中处理直至处理无误

      1. 对于Hash槽Root节点为空的情况,会新建一个node对象,通过CAS的方式写入数组槽,确保只有一个线程写入成功,不成功的线程会再次循环获取到该Hash槽正确的节点引用

      2. 对于Hash槽Root节点不为空的情况,会对命中的Hash槽的Root节点对象使用synchronize加锁。

    6. 扩容的时候,会生成一个NextTable数组,用于数据的迁移,一个一个槽位的数据迁移,支持多个线程辅助进行数据迁移,同时原数组的节点会被替换为ForwardingNode,用于在NextTable未替换Table的时候,将Table的数据获取转发到NextTable数组中,确保数据查询无误。

    7. 此外,对于Map中元素个数的计数,使用了内存填充的方式,保证CPU缓存之间不存在伪共享问题,提升效率。

  6. BlockingQueue有哪些实现类

    1. ArrayBlockingQueue:基于数组实现的有界阻塞队列,先入先出

    2. LinkedBlockQueue:基于链表的无界阻塞队列,但是最大支持Integer.MAX_VALUE个元素

    3. SynchronousQueue:不缓存任务的阻塞队列,生产者直到消费者取出该任务之前会一直阻塞,线程数到达最大线程数时直接拒绝

    4. PriorityBlockQueue:具有优先级的无界阻塞队列,优先级通过Comparator实现

    5. https://blog.csdn.net/Jiangtagong/article/details/121855261

  7. 线程池构造方法有哪些参数

    1. 核心线程数(最小线程数):存在该数量的线程,即使线程空闲,也不会销毁线程

    2. 线程池最大线程数:任务队列满后,最多创建用于任务处理的线程

    3. 空闲线程存活时间+空闲线程存活时间单位

    4. 工作队列,提交的线程任务,队列实现有:ArrayBlockingQueue、LinkedBlockQueue、SynchronousQueue、PriorityBlockQueue

    5. 线程工厂:创建新线程的工厂

    6. 拒绝策略:任务队列放不下时的处理策略

      1. 在调用线程直接执行任务的run方法,线程池shutdown时直接抛弃任务

      2. 直接丢弃任务,抛出RejectedExecutionException

      3. 直接丢弃任务,无后续操作

      4. 丢弃任务队列最早的任务,再次尝试插入当前任务

  8. public static synchronized method1(){}和public synchronized method2(){}中synchronized区别

    1. 静态方法中使用时,锁定的是这个方法所属类的类对象XXX.class

    2. 实例方法中使用时,锁定的是当前的对象实例new XXX()

  9. 内存不足有哪些错误

    1. 堆:OutOfMemoryError

    2. 栈:StackOverflowError

  10. 怎么查看运行中jvm的线程状态

    1. jps

    2. jstack <pid>

  11. 怎么查看运行中jvm的GC情况

    1. jps

    2. jstat -gc <pid>

S0C:第一个幸存区的大小,单位KB

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

OC:老年代大小

OU:老年代使用大小

MC:方法区大小

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间,单位s

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间,单位s

GCT:垃圾回收消耗总时间

  1. 怎么查看运行中jvm的对象信息

    1. jps

    2. jmap -histo <pid>

  1. 怎么查看运行中Redis的状态

    1. redis-cli

    2. info

  1. Http响应码302和304的区别

    1. 302代表重定向,将引导客户端跳转到Location响应头标识的URL中

    2. 304代表缓存有效,请求携带有效的If Modified Since请求投时,根据该时间与资源实际修改时间对比,若资源未发生变化,响应码返回304,告知客户端使用缓存即可;若返回200,则同步在响应体中返回资源数据,客户端将根据响应头,决定是否缓存当前响应信息。