本次更新:20180319
一、Mysql:
1.S锁(共享锁)、X锁(排它锁):select语句默认加S锁;
2.聚簇索引与非聚簇索引:聚簇索引关键字与值存在一起,非聚簇指向主键索引;
3.b+tree:索引树的深度相同,效率稳定。
3.死锁:锁竞争,顺序访问表、拆分长事务,提前锁定资源,降低隔离级别、添加索引。
4.定位死锁:查看mysql日志,查看死锁对应的表;
5.原子性实现原理:通过redo和undo日志,保存了未执行的步骤以及回滚之前的未完成的操作。
6.隔离性实现原理:通过乐观锁和悲观锁实现,悲观锁如行锁表锁等,乐观锁如版本id等。
二、Redis:
1.redis与zk实现分布式锁原理,区别;
red is超时后别的线程新加锁然后被释放,可以在val中添加唯一值。
2.redis cluster集群结构;
三、Nginx:
1.统计nginx访问日志top10 ip地址;
2.vip如何实现:lvs;
四、dubbo + zk:
1.dubbo如何做负载均衡:zk维护目录服务,由算法支撑(如轮询、随机);
2.dubbo + zk架构图;
3.zk 的leader选举;
五、并发:
1.高并发场景高可用如何实现;
2.编写代码让cpu负载超过75%;
3.伪共享:缓存行中存储了两个数据,分别在不同的核中写操作,导致双方的数据无效,解决方案:缓存行填充(使用volatile修饰的变量追加字节数至缓存行的容量);
5.公平锁(FIFO队列)、非公平锁(随机抢占);
6.实现同步的方式:
volatile(可见性、有序性、不保证原子性)
synchronize(原子性、有序性)
threadLocal
Lock
countdownLauch(AQS:通过cas维护volitile变量state实现同步)
cyclicBarrier
Smaphore
Future
Thread.join()
ReentrantLock的实现?通过aqs与cas实现。
公平锁与非公平锁的实现?非公平锁会去通过cas去获取锁,而公平锁直接加入队列。
六、事务:
1.脏读:读到未提交数据;
2.不可重复读:同一事务读取两次,第二次读取到别人修改的数据;
3.幻读:同一事务读取两次,第二次读取到别人插入的数据;
4.避免幻读原理:使用gap锁,在索引区间上下加锁。
5.事务传播行为:requireNew使用场景:转账A->B,A扣款操作新启事务;
七、linux:
1.jmap:dump内存快照,怎么分析;
2.jstack出来的线程有哪些状态;
3.ps grep命令
八、单例:
1.懒加载:double check:使用synchronize(如何保证保证同步)保证同步;
九、查找:
1.手写二分法查找;
十、锁:
1.lock与synchronize区别:lock可以手动释放锁资源等;
十一、GC:
1.GC区域划分:年轻代、年老代、永久代。
2.young GC原因:young在分配对象时eden不足、触发young gc;
3.full gc 原因:
- 调用System.GC;
- 当young区有晋升old,old区不足时,会触发full gc;
- 永久代分配空间不足触发;
4.full gc处理:
- 原因:young区不足、old区不足、代码分配过多对象、元空间不足;
- 方案:升级硬件,查看young区8:1:1是否调整过,查看young:old 的1:2是否调整过,适当调整old区域大小、优化代码、增加机器;
- 步骤:ps -ef | grep java ,获取java进程,jstat -gcutil 获取GC情况,jmap -dump生成堆信息分析,jmap -his查看对象分布情况。
十二、代理:
1.JDK和CGLIB的区别浅谈
十三、序列化
jdk:序列化内容包括类名,元数据,版本等信息,效率较低;
json:跨语言,效率较低;
hessian:以map的形式存储字段,支持弱类型集合;
msgpackage:按顺序存储字段,不支持弱类型集合(注意按顺序添加字段);
protobuf:需要编写.proto文件(将字段与类型对应),根据不同类型的数据采用不同的编码方式,跨语言,效率极高;
十四、服务:
熔断:服务可用率降低到一定比例时为了自保从而拒绝服务;
降级:在自保的过程中,停掉部分不重要的功能,通过fallback返回一个约定好的值;
限流:限制流量,通过配置线程池实现;
Hystrix的设计原则包括:
1.资源隔离(每个服务都配置相应的线程池,隔离资源,防止雪崩)
2.熔断器(通过服务的可用率是控制开关)
3.命令模式(通过继承command调用run方法逻辑,并添加失败后的降级逻辑)
Hystrix的内部处理逻辑:先创建Command,在判断熔断器是否关闭,再获取线程池执行任务。
十五、分库分表:
分库后如何解决join问题:使用字典表做冗余、使用ES。
**、内存模型
1.Integer占用多少个字节;