请选择 进入手机版 | 继续访问电脑版

数据开发面试题准备

[复制链接]
菜鸡 发表于 2021-1-2 19:42:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
背 景

最近要口试几个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 所指向的位置便是环的入口
  1. 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.线程池的构造参数与工作原理?线程池启动线程的原理?
  1. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue 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,找到谁人线程相关的东西 )

来源:https://blog.csdn.net/PENGYUCHENG32109/article/details/111410502
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )