一面
1 HashMap,HashTable,ConcurrentHashMap 1.7 与 1.8 的区别
HashMap
HashTable
Hashtable 和 HashMap 采用相同的存储机制,但 Hashtable 是线程安全的,其内部方法几乎都被 synchronized 修饰,粒度比较大
ConcurrentHashMap
具体见文章:并发容器碎碎念
2 实际项目中使用 es 碰到的问题,es的缺点,es-sql 的缺点,es索引的重建
实际项目中使用 es 碰到的问题
- 同步延时,ES的数据同步来源于MySQL,会出现不同程度的同步延时
- 数据丢失,当同步服务出现异常或ES不可用,可能会出现ES数据丢失
- 并发度低,在压测过程中,发现从es查询的接口性能较差,不能支持高并发,容易出现cpu100%和es集群卡死的情况
es索引的重建
由于某些es索引可能一开始没有设计很好,在持续运行过程中发现对于查询或使用不友好、存在性能问题时,需要对这些索引进行重建。
3 elastic-job 的原理
Elastic-Job是当当⽹开源的⼀个分布式调度解决⽅案,依赖于Zookeeper进⾏分布式协调。
4 1亿的数据,找出 top100,怎样实现,怎样划分(海量数据top K 问题)
分治+trie树/hash+小顶堆,即先将数据集按照hash方法分解成多个小数据集,然后使用trie树或者hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出频率最高的前K个数,最后在所有top K中求出最终的top K。
5 垃圾收集器;jvm 老年代和年轻代
垃圾收集器
串行收集器 Serial:Serial,Serial Old
并行收集器 Paraller:Paraller Scavenge,Paraller Old,吞吐量高
并发收集器:CMS,G1,停顿时间少
jvm 老年代和年轻代
Java 的堆进行分代管理是为了方便垃圾回收
年轻代:存放新创建的对象。当对象从这块内存区域消失时,说明发生了一次Minor GC。
老年代:存活下来的年轻代对象被复制到这里。GC 发生的次数少于年轻代,对象从老年代消失,说明发生了一次 Major GC 或 Full GC。
具体见文章学到便秘之 JVM
7 kafka 怎样处理重复消费,为什么选择kafka
Kafka是一款开源的消息引擎系统,用来实现解耦的异步式数据传递。即系统 A 发消息给到 消息引擎系统,系统 B 通过消息引擎系统读取 A 发送的消息,在大数据场景下,能达到削峰填谷的效果。
手动提交与自动提交结合来处理重复消费
具体见文章:学到羊之Kafka
8 redis 主从复制
Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。
读操作:主库、从库都可以接收;
写操作:首先到主库执行,然后,主库将写操作同步给从库。
具体见文章:学到生无可恋之 Redis(下)
9 spring bean 生命周期,可以自主销毁单例 bean 吗
也可以自主调方法销毁单例bean
- 在配置类中指定 @Bean(initMethod = “init”,destroyMethod = “destory”)注解
- 实现InitializingBean接口并重写其afterPropertiesSet方法,实现DisposableBean接口并重写destroy方法
- @PostConstruct标注在init方法上,@PreDestroy标注在destroy方法上
10 哪个中间件你最熟悉,具体说一说
11 mybatis 分页插件的原理
12 String,SringBuilder,Stringbuffer 的区别
String 和 StringBuffer
1)String是个不可变长度的字符串;StringBuffer是个可变长度的字符串;
2)在对String类进行操作的时候(例如增加字符),实际上是在内存中产生了一个新的String对象;StringBuffer是给原对象增加字符,不是新创建一个对象;
3)String 覆盖了equals() 方法和 hashCode() 方法,而StringBuffer没有覆盖equals() 方法和 hashCode() 方法。
StringBuilder 和 StringBuffer
StringBuilder是线程非安全的,StringBuffer是线程安全的,二者的方法都是一样的
13 valotile 关键字用来保证可见性
在变量的前面加上 volatile 关键字修饰,该变量就拥有了可见性,每一次变量被修改时,其他线程都对此可见,这样一旦线程 1 改变了这个值,那么线程 2 就可以立刻看到。