引言
今天下午进行了“步步高”二面,然后在这里稍微复盘一下“咱就是说,咱啥也不是”
哈希索引和b+树索引的区别
B+Tree首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,提高了查找效率(为了加快查找效率,将树变得更扁平); 为了更好的支持范围查询,B+树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针相连;
哈希索引的话是基于哈希算法做的,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需要一次hash算法即可立即定位到相应的位置,速度非常快。 缺点: 因为底层数据结构是散列的,无法进行比较大小,不能进行范围查找
(这题我答的不是很好,在哈希索引这里卡住了,太久没看了。。。难受)
当redis的内存满了,redis是如何去清理内存的
1.通过配置文件“redis.conf”配置redis的内存大小
//设置Redis最大占用内存大小为100M
maxmemory 100mb
2.通过命令修改
//设置Redis最大占用内存大小为100M
127.0.0.1:6379> config set maxmemory 100mb
//获取设置的Redis能使用的最大内存大小
127.0.0.1:6379> config get maxmemory
3.redis的淘汰策略(我觉得面试官主要想考察这里)
- noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
- allkeys-lru:从所有key中使用LRU算法进行淘汰
- volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
- allkeys-random:从所有key中随机淘汰数据
- volatile-random:从设置了过期时间的key中随机淘汰
- volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰
(属于完全摸瞎,自己用的时候没出现过内存满的情况)
深拷贝和浅拷贝的区别
深拷贝和浅拷贝的一些基础东西看篇就差不多了深拷贝和浅拷贝的区别
主要说一下自己没答上来的:
- LinkedList中的addAll是深拷贝还是浅拷贝,底层是怎么实现的(这个之前看过源码,知道是浅拷贝,但是实现就忘记了)
- Arrays中的copyOf是深拷贝还是浅拷贝(这里我也大概知道是浅拷贝,当时不太确定,所以就说不清楚,还得多看!)
jvm的内存区域
这块的话算是自己比较熟悉的领域,答得中规中矩,上张图就行了
你是怎么通过dump文件分析出OOM产生得问题的,说一下过程
这里就直接跳过吧,有时间我写一篇博客专门来解答这个问题 “还得从我拿dump文件说起。。。。”
你用redis一般做什么用
这里我答的是“热点数据的存储”、“缓存”、“跟websocket搭配进行消息传递”、“分布式锁”
操作系统的缓存清理
直接离了大谱,这个题属于是完全记不得,只知道有三级缓存的概念,缓存清理完全忘记。。。。。。。
回表查询有了解过吗?
非主键索引查找数据时需要先找到主键,再根据主键查找具体行数据,这种现象叫回表查询(应该是我说最近在弄索引,所以才问了这个。。。我还没答上来(/(ㄒoㄒ)/~~))
线程池的几个参数说一下
public ThreadPoolExecutor(
//核心线程数
int corePoolSize,
//池中允许的最大线程数
int maximumPoolSize,
//当线程的数量大于核心时,这是剩余空闲线程在终止前等待新任务的最大时间
long keepAliveTime,
//参数的时间单位
TimeUnit unit,
//在任务执行之前用来保存任务的队列。这个队列将只保存由execute方法提交的Runnable任务。
BlockingQueue<Runnable> workQueue,
//执行器创建新线程时使用的工厂 Handler—当线程边界和队列容量达到时,执行被阻塞时使用的处理程序
ThreadFactory threadFactory,
//拒绝策略
RejectedExecutionHandler handler
)
这个题漏了一个队列,罪过,但是还以为答到了(难受的一批)
什么情况下会触发拒绝策略
当提交的任务数大于(workQueue.size() + maximumPoolSize ),就会触发线程池的拒绝策略
(这里也答得不全面)
说一下Executors创建中的几种线程池
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
io和nio的区别,你熟悉的技术中那些用到了nio
答了个阻塞和非阻塞,“tomcat”、“netty”
大概就这些,总体来说,答得比较不理想,主要现在在实习,准备不够充分,明天三面加油(顺便提一嘴,面试官人非常好!)