数据开发面试题准备
Posted 彭宇成
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据开发面试题准备相关的知识,希望对你有一定的参考价值。
背 景
最近要面试几个java&数据开发同学,稍稍准备几个题目
问 题
笔试题
1)伪代码实现:判断单链表是否有环 ;
2 ) 现有一张包括员工姓名、薪水、省份、城市、年龄、职位等字段在内的员工信息表; 请写 sql 查出:每个城市中薪水高于 2w 的所有员工信息 以及 该城市高于2w对应的员工人数?
说明:正确的查询结果集中可能有如下的记录 :
张三、3w、广东省、惠州市、30、java高工、100(注:假设薪水大于2w的员工中,有100名来自惠州)
李四、2.5w、广东省、惠州市、31、java高工、100
… …
算法原理
a. 操场上有两个人在跑步,同一起点:如果操场是圆的,跑的快的同学( faster ),肯定可以超越并再次追赶上跑的慢的同学( slower ),or 如果操场是直线的,跑的慢的同学,永远在后面
b. faster 和slower 相遇,链表有环,此时将slower移回头结点位置; 让faster和 slower 每次都走一步; 再次相遇,此时 slower 和 faster 所指向的位置即是环的入口
public class Solution
public ListNode detectCycle(ListNode head)
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null)
fast = fast.next.next;
slow = slow.next;
if(fast == slow)
break;
if(fast == null || fast.next == null)
return null;
slow = head;
while(fast != slow)
slow = slow.next;
fast = fast.next;
return slow;
2 ) 考查开窗函数的应用与理解:怎么在明细结果集中,同时出现汇总列
select pid ,province ,city ,salary ,count(salary ) over( partition by city ) as num from fdm_tmp.functiontest_1 where salary >=20000
面试题
并发相关
1)线程池相关:
a.线程池的构造参数与工作原理?线程池启动线程的原理?
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
b.常用的线程池有哪些,不同线程池的使用场景是什么?FixedThreadPool满了之后会怎么办 ~ 用的无界队列 LinkedBlockingQueue,存在内存溢出的可能。
线程池被关闭的方式有哪几种? shutdown() 与 shotdownNow()
2)volital 关键字 与 AQS 组件解释
a. java 里悲观锁与乐观锁是怎么玩的? CAS 是啥,怎么实现的,有什么缺点?(ABA 问题怎么解决·AtomicStampedReference)
b. AQS 是啥?核心的数据结构?一个FIFO队列 与 一个 volitale state
java用来构建锁和其他同步组件的一个基础框架;ReentractLock之类的都是基于AQS来的,比如ReentractLock里面,某个线程想要获取锁,那么就会走AQS定义好的基础逻辑,获取state值啥的
设计模式
结合实际项目应用场景,解读一个设计模式(单例与工厂模式除外)
JVM
-
JVM内存区域?哪些内存区域会参与GC? 什么情况下一个对象会被GC? minor gc 与 full gc ? 新生代与老年代 gc 回收策略?
-
线上 OOM 定位与解决思路
a. 确认问题
dmesg |grep -E ‘kill|oom|out of memory’ : 查看操作系统启动后的系统日志
b. 重现问题:jstat -gcutil 20886 1000 10 : 查看survivor 区、eden区、老年代的使用率以及 young gc 与 full gc 使用次数
c. 分析问题(找出哪些对象占用内存过多):jmap -histo:live 20886 ~ 查出哪些对象占用内存过多
d. jmap -dump:format=b,file=heap.hprof /opt/zhss/java/bin /tmp/dump.core ~ 输出堆内存快照 : 显示每个对象占用的内存大小 ~ eclipse MAT 插件分析
e. 解决问题:加机器、优化代码(内存溢出的代码)
中间件
- 为什么用 中间件,结合业务场景描述一下;用了中间件有什么优缺点? 缺点怎么规避,eg. 怎么保证全链路的数据不丢失?
- 中间件 eg. kafka 如何实现每秒 几十万的高并发写入?大致的优化思路。
零拷贝;page cache or os cache - 如果让你尝试写一个消息中间件,如何进行架构设计,需要考虑哪些点? 说一下大致的思路
a. 可伸缩 broker-topic-partition 分布式存储
b. 数据不丢失 落地到磁盘,顺序写,oscache
c. 高可用 多副本 leader . follower : leader 挂了重新选举 对外提供读写服务
d. 数据O丢失方案
生产问题
线上服务器的cpu使用达到100%了,如何排查、定位和解决?
相关答案说明
一. 线程池构造参数与工作原理
假设我们自己手动创建一个ThreadPoolExecutor线程池,设置了以下的一些参数:
corePoolSize:2个
mamximumPoolSize:4个
keepAliveTime:60s
workQueue:ArrayBlockingQueue,有界阻塞队列,队列大小是4
handler:默认的策略,抛出来一个ThreadPoolRejectException
(1)一开始线程池里的线程是空的,一个都没有。有一个变量维护的是当前线程数量,这个变量是poolSize,poolSize = 0,如果当前线程的数量小于corePoolSize(2),poolSize < corePoolSize,那么来了一个任务优先创建线程,直到线程池里的线程数量跟corePoolSize一样;poolSize = 1,poolSize < corePoolSize(2),又创建一个线程来处理这个任务;poolSize = 2
(2)如果当前线程池的线程数量(poolSize = 2)大于等于corePoolSize(2)的时候,而且任务队列没满(最大大小是4,但是当前元素数量是0),那么就扔到任务队列里去
(3)如果当前线程池的线程数量大于等于corePoolSize的时候,而且任务队列满了(最大大小是4,当前已经放了4个元素了,已经满了),那么如果当前线程数量小于最大线程数(poolSize = 2,maimumPoolSize = 4,poolSize < maximumPoolSize),就继续创建线程;poolSize = 3,提交了一个任务,poolSize >= corePoolSize,任务队列满,poolSize < maximumPoolSize,再次创建一个任务
(4)如果此时poolSize >= corePoolSize,任务队列满,poolSize == maximumPoolSize,此时再次提交一个任务,当前线程数已经达到了最大线程数了,那么就使用handler来处理,默认是抛出异常,ThreadPoolRejectExeception
(5)此时线程池里有4个线程,都处于空闲状态,corePoolSize指定的是就2个线程就可以了,但是此时超过了corePoolSize 2个线程,所以如果那超出的2个线程空闲时间超过了60s,然后线程池就会将超出的2个线程给回收掉
如何设置池的这些参数?先来看看创建线程池的默认代码
其实上面都说过了,啥时候会创建新线程?其实就是线程数没到corePoolSize的时候,会创建线程;接着就是任务队列满了,但是线程数小于maximumPoolSize的时候,也会创建线程;创建的时候通过threadFactory来创建即可
二. cpu % 问题定位思路
1)找到事故服务器上,是哪个进程的哪个线程的哪段代码,导致cpu 100%
2 ) top -c、top -Hp PID、jstack 43987 | grep ‘0x41e8’ -C5 --color ( 用jstack打印进程的堆栈信息,而且通过grep那个线程的16进制的pid,找到那个线程相关的东西 )
以上是关于数据开发面试题准备的主要内容,如果未能解决你的问题,请参考以下文章