面试系列
库昊天
这个作者很懒,什么都没留下…
展开
-
“promotion failed”问题排查
触发时机 YGC时,Survivor空间溢出,溢出部分对象进入老年代时,如果空间不足则抛出“promotion failed”错误。造成影响触发FGC可能原因及方案Survivor空间过小;老年代空间小或者碎片多;原创 2018-04-09 10:35:42 · 3600 阅读 · 1 评论 -
分布式事务
转载:https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html;http://www.codeceo.com/article/distributed-transaction.html;什么是分布式事务? 分布式事务是指事务中涉及到的操作分布在不同机器或者不同应用上...转载 2018-05-14 15:33:43 · 148 阅读 · 0 评论 -
MySQL索引
概念聚簇索引:数据的存储顺序与主索引的顺序保持一致;非聚簇索引:索引顺序与物理存储顺序无关;聚簇索引聚簇索引具有唯一性,因为聚簇索引的顺序就是数据的物理存储顺序。优点:读速度比非聚簇索引快,因为少一次IO;缺点:如果涉及到重排序,聚簇索引的写速度会很慢; It is generally faster to read from a clustered index ...原创 2018-05-21 20:41:38 · 253 阅读 · 0 评论 -
主键设计:自增序列
背景:对于Innodb引擎,每个表都必须显示设置一个主键;设计原则主键越短越好,最好是单向自增型;主键最好由一个字段构成,最多不能超过3个字段;作为主键的列在插入后不能修改或者极少修改,否则考虑自增列作为主键;自增型主键优点(使用id为主键原因)1. 自增型主键可以避免重排序,提高写性能; 2. 自增型主键可以降低二级索引的空间,提升二级索引的内存命中率; 3. 自...原创 2018-05-21 20:53:50 · 703 阅读 · 0 评论 -
JDK异常类
类体系Throwable:所有异常类的基类,有两个重要的子类Exception(异常)和 Error(错误);Error:JVM内部抛出的错误,是程序无法处理的错误;Exception:程序内部抛出的异常,是程序本身可以处理的异常;Checked Exception VS UnChecked Exception不可查异常,是指运行期间不可预知的异常,包括运行时异常(R...原创 2018-05-15 17:50:42 · 2187 阅读 · 0 评论 -
Epoll详解
工作原理1. 创建红黑树调用epoll_create()创建一颗空的红黑树,用于存放FD及其感兴趣事件;2. 注册感兴趣事件调用epoll_ctl()向红黑树中添加节点(FD及其感兴趣事件),时间复杂度O(logN);向内核的中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它添加到就绪队列中。 所以,当一个socket上有数据到了,内核在把网卡上...转载 2018-05-22 11:33:09 · 891 阅读 · 0 评论 -
select/poll详解
基本介绍 select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作。但select(),poll(),epoll()本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I原创 2017-12-11 10:15:17 · 332 阅读 · 0 评论 -
Select、Poll与Epoll 的比较
系统调用 select poll epoll 获取就绪FD的时间复杂度 O(n) O(n) O(1) 获取就绪FD的方式 采用轮询方式检测就绪事件 采用轮询方式检测就绪事件 采用轮询方式检测就绪事件 最大支持文件描述符数 1024(x86) or 2048(x64) 无上限 无上限 FD拷贝 每次sel...原创 2018-05-22 14:07:20 · 243 阅读 · 0 评论 -
数据库索引与B+树
Hash 索引优点:对等比较时(例如=和<=>操作符),查询速度很快,时间复杂度O(1); 缺点:只能用于对等比较,不能被用于像<这样的范围查询条件。假如系统只需要使用像“键值对”的这样的存储结构,尽量使用hash类型索引。优化器不能用hash索引来为ORDER BY操作符加速。只有完整的键才能被用于搜索一行数据(使用了B-Tree索引,那么任何一个键的前缀都可以...原创 2018-05-22 20:02:42 · 259 阅读 · 0 评论 -
怎么实现所有线程在等待某个事件的发生才会去执行?
方案一:读写锁 刚开始主线程先获取写锁,然后所有子线程获取读锁,然后等事件发生时主线程释放写锁;方案二:CountDownLatch CountDownLatch初始值设为1,所有子线程调用await方法等待,等事件发生时调用countDown方法计数减为0;方案三:Semaphore Semaphore初始值设为N,刚开始主线程先调用acquire(N)申请N个信号量,...原创 2018-05-16 16:31:54 · 2506 阅读 · 1 评论 -
阿里为什么不用 ZooKeeper 做服务发现?
转载:https://kuaibao.qq.com/s/20180606B0DUOJ00?refer=spider原因 在服务发现领域,ZooKeeper并不是最佳的选择。原因可以从客户端和服务端两个方向进行分析。 客户端ZK服务端集群的地址列表是写死在客户端的,不支持动态变更;不支持同机房优先策略;没有针对服务端集群完全不可用时的容灾手段;服务端写能...原创 2018-06-23 13:26:21 · 2063 阅读 · 0 评论 -
ZooKeeper双机房部署方案讨论
背景 对于ZK集群,理论上至少三个机房才能真正做到跨机房容灾。但在实际环境中,由于成本的原因,大多中小公司采用双机房部署的方案,存在两种形式。方案一:非对等部署 非对等部署:投入更多的资源重点维护某个机房,如下图所示。优点集群总量可为奇数,容错性更好;有一定的跨机房容灾能力,机房B挂掉认可正常运行;缺点存在数据丢失的可能(机房A被毁,且Master在机房...原创 2018-06-23 14:25:50 · 7827 阅读 · 0 评论 -
StringBuilder解析
实现原理1. 创建实例 StringBuilder实例被创建时,有一定容量的char[]被创建。 public StringBuilder() { super(16); }AbstractStringBuilder(int capacity) { value = new char[capacity]; }2. appen...原创 2018-06-23 15:50:12 · 396 阅读 · 0 评论 -
Hystrix隔离策略
Hystrix隔离方案 Hystrix提供了两种隔离的解决方案:线程隔离和信号量隔离,默认为线程隔离。private static final ExecutionIsolationStrategy default_executionIsolationStrategy = ExecutionIsolationStrategy.THREAD; public static enum E...原创 2018-06-25 15:56:58 · 1940 阅读 · 1 评论 -
常用框架面试大纲
Hystrix 简介: Hystrix防雪崩利器,能够在依赖的第三方服务出现故障时,进行自我保护,避免级联故障。 原理: Hystrix核心思想是全链路形成闭环,出口处通过线程\信号量隔离策略进行自我保护,入口处基于熔断器实现Fail-Fast机制,如下图所示: ...原创 2018-12-17 13:59:12 · 263 阅读 · 0 评论 -
如何合理地估算线程池大小?
整体思路首先,确定线程池要执行任务的性质:CPU密集型或者IO密集型;如果是CPU密集型,说明请求的处理比较占用CPU资源,瓶颈在于CPU,增加线程数作用不大;如果是IO密集型,说明请求的处理占用IO资源,CPU比较空闲,此时应该合理地增加线程数;实际操作Step1:预估初始大小 Step2:调整初始大小 根据压测目标,对初始值进行调整,得到最佳的性能指标。...原创 2018-08-01 11:31:57 · 1098 阅读 · 0 评论 -
Java并发之CopyOnWriteArrayList
特点 线程安全的ArrayList原理 读不加锁,写加锁,写时生成新的数组,数据拷贝。get() 直接读取,无加锁操作,如代码所示: @SuppressWarnings("unchecked") private E get(Object[] a, int index) { return (E) a[index]; } /**...原创 2018-05-14 12:00:12 · 140 阅读 · 0 评论 -
ChannelOutboundBuffer
创建时机 Unsafe实例被创建,即创建Channel时,ChannelOutboundBuffer被创建,每个Channel实例对应一个ChannelOutboundBuffer实例。 数据结构 ChannelOutboundBuffer实质上是无界的单向链表,如下图所示: write&flushwrite本质:将待发送数据写入ChannelOutb...原创 2018-05-04 12:05:00 · 1126 阅读 · 0 评论 -
ChannelConfig
类体系Channel通用参数CONNECT_TIMEOUT_MILLIS:连接超时时间,默认30s;ALLOCATOR:ByteBuf分配器,默认为PooledByteBufAllocator;RCVBUF_ALLOCATOR:接受缓冲区分配器,默认为AdaptiveRecvByteBufAllocator;AUTO_READ:当Channel的接受缓冲区有数据时,是否自动产生OP_READ原创 2018-05-03 17:20:44 · 917 阅读 · 0 评论 -
Connection reset by peer原理解析
“Connection reset by peer”代表什么?“Connection reset by peer”表示当前服务器接受到了通信对端发送的TCP RST信号,即通信对端已经关闭了连接,通过RST信号希望接收方关闭连接。 The remote server has sent you a RST packet, which indicates an immediate dropping原创 2018-04-02 20:25:02 · 29410 阅读 · 0 评论 -
事务隔离级别
概念事务的隔离性是指并发事务之间的隔离程度,隔离程度越高,数据可见性越底,能够支持的并发程度越低。隔离级别READ UNCOMMITTED;READ COMMITTED;REPEATABLE READ(默认);SERIALIZABLE;READ UNCOMMITTED定义:事务A能够读取到事务B未提交的数据; 问题:脏读。如果事务B发生回滚,则事务A读取到的...原创 2018-04-15 11:58:33 · 254 阅读 · 0 评论 -
Java并发之基础理论
线程不安全分析 对共享变量进行写操作时,原子性、可见性和有序性不能同时保障,导致线程不安全,如下图所示: 反过来说,如果没有共享变量,或者只存在共享变量的读操作则不会存在线程安全问题。原子性定义:原子性就是指对数据的操作是一个独立的、不可分割的整体。也就是说线程A操作数据的过程中,其它线程是无法进行修改的。 非原子性原因:一条操作系统指令的执行是原子性的,但是通常Jav...原创 2018-03-27 11:34:42 · 242 阅读 · 0 评论 -
Java基础之数组内存分配
数组名即引用在Java栈空间,数组元素在堆,并且空间连续。正式因为内存地址空间连续,访问数组元素时只需要根据起始地址和元素偏移量即可快速访问数组中的任意元素。如果数组元素是基本类型,数组存放的是基本类型的值,空间中是连续存放的;如果数组元素是引用类型,数组存放的是对象的引用,数组元素是连续存放的,但引用的对象则不一定了。原创 2018-03-27 10:10:40 · 387 阅读 · 0 评论 -
主从复制
主从复制基本原理基本原理: Master开启二进制日志,与Slave建立长连接,当有数据变更时,Master的dump线程推动binlog到Slave,Slave的IO线程接受到数据后写入中继日志文件,并由单独的SQL线程执行相应变更到数据库,如下图所示。 主从复制优缺点优点主备容灾;提高数据库的读能力;缺点高并发时的延时。主库的worker线程在写binlog的时候是并发工作的,而主库的原创 2018-04-14 16:30:59 · 233 阅读 · 0 评论 -
FGC问题排查
问题及原因分类FGC问题分类目前遇到的FGC问题主要分为两大类:FGC频繁(频率高);停顿时间长(FGC持续时间长);FGC原因分类引发FGC问题的原因也主要分为两大类:JVM参数设置不合理;程序Bug;FGC频繁排查JVM参数不合理Young与Old比例不合理Old空间占比过小;Eden与Survivor比例不合...原创 2018-04-09 13:01:47 · 4064 阅读 · 0 评论 -
JVM之常见问答
FGC触发时机?老年代空间满;永久代空间满;对象进入老年代的几种情况长期存活对象(生存周期超过设置阈值,默认15);大对象(避免在Young区来回复制);Survivor溢出(Eden和From Survivor存活对象大小超过了To Survivor大小);为什么大对象直接进入老年代?避免大对象在Survivor的回复制,效率低下;防止Survivo...原创 2018-04-07 16:40:03 · 219 阅读 · 0 评论 -
负载均衡之LVS
什么是LVS? LVS是四层负载均衡器,Linux2.4内核以后天然支持(内核的一部分),其网络架构如下所示: 备注:LVS对外暴露的公网IP叫做“VIP”。LVS工作模式NAT模式 NAT(Network Address Translation)网络地址转换,即将一个IP地址转换为另一个IP地址的技术,如下图所示: LVS接收到请求,根据调度算法得到实际...原创 2018-04-01 18:00:48 · 361 阅读 · 0 评论 -
“concurrent mode failure”问题排查
concurrent mode failure是什么? CMS垃圾收集器特有的错误,CMS的垃圾清理和引用线程是并行进行的,如果在并行清理的过程中老年代的空间不足以容纳应用产生的垃圾,则会抛出“concurrent mode failure”。concurrent mode failure影响 老年代的垃圾收集器从CMS退化为Serial Old,所有应用线程被暂停,停顿时间变...原创 2018-04-08 21:00:03 · 2280 阅读 · 0 评论 -
Java并发之CAS
什么是CAS? CAS(Compare and Swap)比较并交换,一种乐观锁机制,是CPU级别的指令,能够保证操作的原子性,是Java并发包的基础。JDK在sun.misc包下Unsafe的类里提供了CAS相关的方法。CAS实现原理 基于cmpxchg汇编指令实现。CAS优缺点优点高效:硬件级别的原子操作,性能高;保证操作的原子性;缺点不适用...原创 2018-03-31 12:29:18 · 328 阅读 · 0 评论 -
Java并发之AQS
AQS介绍 AQS(AbstractQueuedSynchronizer),是JDK并发包下的锁模板,包含共享模式和排他模式,是并发包下大部分的基础,如ReentrantLock、Semaphore和CountDownLatch等等。State属性和CLH队列是AQS的关键元素,子类通过State属性判断线程是否需要阻塞,CLH队列为线程阻塞队列,提供了线程阻塞和唤醒的实现。AQS原理概...原创 2018-03-25 14:46:13 · 410 阅读 · 0 评论 -
JVM之性能调优
优化指标吞吐量 吞吐量=CPU运行用户代码时间/(GC时间+运行用户代码时间)延迟平均延时(YGC持续时间);平均延时频率(YGC频率);最差延时(FGC持续时间);最差延时频率(FGC频率);内存占用基础准备GC日志GC日志是性能调优及问题排查的基础,常用参数及格式如下所示: OOM内存镜像-XX:+HeapDump...原创 2018-04-07 15:38:50 · 280 阅读 · 0 评论 -
Java基础之ConcurrentHashMap(二)
基于CAS的ConcurrentHashMap(JDK1.8)数据结构 JDK8版本的实现摒弃了JDK6版本中Segment(锁段)的概念,底层利用“数组”+链表+红黑树的方式实现了全并发。 构造函数 构造函数只是确定了数组的初始容量,并没有真正创建数组,第一次插入元素时才会创建数组。 public ConcurrentHashMap(int initi...原创 2018-03-20 19:19:30 · 277 阅读 · 0 评论 -
Java并发之ReentrantLock
ReentrantLock特点可重入(持有锁的线程可多次获取锁);可中断(获取锁时如果线程被中断抛出中断异常);公平锁(按照FIFO顺序获得锁)和非公平锁(高吞吐量);互斥锁;ReentrantLock类关系FairSync与NonfairSync的区别和联系 对于非公平锁,当前线程会优先尝试获取锁,获取失败时进入公平模式,如代码所示: ...原创 2018-03-24 17:11:25 · 280 阅读 · 0 评论 -
Java基础之ConcurrentHashMap(一)
基于分段锁的ConcurrentHashMap(JDK1.7)初始化concurrencyLevel大小决定了Segment数组容量,即最大并发程度;ConcurrentHashMap对象创建时,Segment数组即被创建;Segment数组被创建后容量不再变化,扩容弄只会改变每个Segment中HashMap的容量;get过程(读不加锁)二次哈希:根据k...原创 2018-03-20 11:27:16 · 562 阅读 · 0 评论 -
InnoDB并发控制技术之MVCC
MVCC是什么? MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。MVCC的作用读不阻塞写,提高并发性; MVCC实现原理(Innodb引擎)核心思原创 2018-04-15 16:58:34 · 441 阅读 · 0 评论 -
Java并发之volatile
volatile的作用可见性。当一个线程修改了被volatile修饰的变量后,无论是否加锁,其它线程都可以立即看到最新的修改。有序性。程序按照代码的先后顺序执行。volatile的实现原理可见性实现原理修改volatile变量时会强制将修改后的值刷新的主内存中;同时将其它线程工作内存中对应的变量值失效;有序性实现原理 JVM使用“内存屏障”来实现volatile语义。内存屏障,也叫做内原创 2018-03-27 20:21:27 · 353 阅读 · 1 评论 -
MySql索引之B+树
数据结构选择标准 使用何种数据结构作为索引底层实现的一个重要衡量指标就是磁盘IO的操作次数。对于数据库而言,索引本身也很大,需要以索引文件的形式存储在磁盘上,因此磁盘IO操作次数直接决定了索引的性能。使用B+树的原因 B+树能够有效利用系统对磁盘的块读取特性,在读取相同磁盘块的同时,尽可能多的加载索引数据,来提高索引命中效率,从而达到减少磁盘IO的读取次数。B+树能有效减少磁盘IO的原理概述:平原创 2018-04-10 15:49:26 · 276 阅读 · 0 评论 -
OP_ACCEP、OP_READ和OP_WRITE的注册
OP_ACCEP注册 首先,ServerSocketChannel创建时就指定感兴趣事件OP_ACCEPT;然后,在注册阶段,直接向Selector注册OP_ACCEPT; public NioServerSocketChannel(ServerSocketChannel channel) { super(null, channel, SelectionKey.OP_ACCE原创 2018-05-03 15:33:46 · 2160 阅读 · 0 评论 -
SO_SNDBUF和SO_RCVBUF
含义SO_SNDBUF:TCP发送缓冲区的容量上限;SO_RCVBUF:TCP接受缓冲区的容量上限;注意:缓冲区的上限不能无限大,如果超过内核设置的上限值,则以内核设置值为准(sysctl -a命令查看)。 net.ipv4.tcp_rmem = 8192 87380 16777216 net.ipv4.tcp_wmem = 8192 65536 16777216 ...转载 2018-04-24 21:08:12 · 17188 阅读 · 0 评论 -
为什么Netty使用NIO而不是AIO?
NIO VS AIO理论上,AIO是真正的异步IO,IO吞吐量是要高于NIO的。两种IO模式的概念如下:NIO:IO复用模型,仍是阻塞IO,通过复用IO线程提升吞吐量;AIO:线程A执行IO操作时,注册回调函数,当IO操作执行完成后,内核通知应用层,由线程B执行回调逻辑;为什么Netty使用NIO而不是AIO?原因:在Linux系统上,AIO的底层实现仍使用EPOLL,与...原创 2018-04-23 17:39:14 · 7924 阅读 · 4 评论