数据开发面试题准备

背 景

最近要面试几个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
  1. JVM内存区域?哪些内存区域会参与GC? 什么情况下一个对象会被GC? minor gc 与 full gc ? 新生代与老年代 gc 回收策略?

  2. 线上 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. 解决问题:加机器、优化代码(内存溢出的代码)

中间件
  1. 为什么用 中间件,结合业务场景描述一下;用了中间件有什么优缺点? 缺点怎么规避,eg. 怎么保证全链路的数据不丢失?
  2. 中间件 eg. kafka 如何实现每秒 几十万的高并发写入?大致的优化思路。
    零拷贝;page cache or os cache
  3. 如果让你尝试写一个消息中间件,如何进行架构设计,需要考虑哪些点? 说一下大致的思路
    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,找到那个线程相关的东西 )

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值