Seeker的奇妙求职历险(腾讯医疗一面和网易有道一面)
前言
没想到PCG一面挂了之后被CSIG的医疗部门捞了,又面了一次,面完之后状态是显示等待复试,但是一直没消息,估计和阿里一样把我晾着吧。
网易有道面试感觉还算和面试官交谈甚欢,但是面完之后到现在都没有收到二面的通知,不会凉了吧。
雷火也是,明天就满一个礼拜了,也一直还是处理中。
哎,秋招真累。
心累归心累,面试整理还是要整理一下,下面还是总结一下这两次面试中遇到的一些问题。
场景/算法题
给出一个100M的文件,文件里面存放了多个英文单词,给出一台内存只有100M的机器,实现一个单词联想的功能,例如输入"ab",输出"abject"(悲惨的,广大秋招的同学们都过得非常悲惨),“abjure”(正式放弃,我正式放弃秋招,回家种田,家里也没有田,就只能啃老打电动,最后被愤怒的老父亲砍死在床上)。
一开始的时候我写了使用set存放文件中的单词,然后根据输入的数据逐个匹配,将结果存放到list中。
然后面试官说,你再看看题目,代码写不出来也没关系,写个伪代码或者说说思路。
我一看只有100M内存,好吧,这样应该不行。
这个故事告诉我们,就算面试时候紧张得不行也一定要多读几遍题目。
然后我说我想使用数据流的方式,每次读入内存一个单词,是就保存,不是就丢弃。
面试官说,这样每次都要遍历一遍太麻烦了,你再想想。
我思考了一会,想起了前几天那道在leetcode复制粘贴的前缀树。
我说,我想对这个文件进行分割,根据开头单词的不同存放到不同的文件中,然后在内存中保存一个map映射这些文件的名字,每次输入之后只把对应的文件读入内存。如果单个文件过大还可以继续分割。
然后面试官说,这样也行吧,本来我想的是压缩,但是你这种分割方式也行。
然后到这里大概10多分钟,也没让我继续写代码了。
Java八股文
面向对象、集合、JUC、volatile、synchronized之类的,这些有道也面了,腾讯这边没有细问,只是volatile让我详细讲了讲底层实现。有道这边让我详细介绍了hashMap、concurrentHashMap以及countDownLatch的实现和原理。
GC八股文
介绍下GC,从回收谁开始说起,GC root、可达性分析、三色标记法、增量更新、原始快照、CMS、G1,最后说说ZGC是怎么实现并发回收的。
计算机网络
腾讯这边真的很喜欢问网络,这次问我说说closed_wait状态发生在哪一端。
线程池
有道这边问了线程池,问我项目中用的什么线程池,我就说了说ThreadPoolExecuter,讲了讲原理,如何实现动态线程的,keepAlive如何实现的。
数据库八股文
有道问的其实不是那么八股文,就问我怎么优化的,怎么查看sql查询慢之类的,没有问我底层实现。
腾讯这边就相当八股文了,说一下事务、怎么实现的。
CPU突然飙升怎么办?
这个问题是腾讯问的,我没想到真有面试问这个的,就凭印象说了说,使用了阿里的arthas进行性能监控,先用top看看哪个进程,然后看看是进程中的哪个线程,这个线程是干嘛的,是业务线程还是GC,业务线程就打印一下当前堆栈信息,看看是不是有死循环或者是一直创建大对象。GC线程就看看哪个对象最多,是不是发生了内存泄漏,最后看看GC日志。最后再决定如何优化。
JVM参数和GC日志
这个问题是有道问的。
问我知道哪些JVM参数,答最大堆、最小堆、栈大小(还说的不是参数xmx)。
问我还有呢,我说还可以设置使用哪个垃圾回收器,设置一些CMS的参数,比如新生代、老年代大小,担保空间、GC阈值之类的。
然后问我有没有调过,有没看过GC日志?
答:没有,垃圾项目不需要调。
感觉是不是太实诚了,不过说调过又要问我怎么调的,到时候答不上来或者无法让他相信感觉会更糟。
从马老师那边找了一份课件,里面有详细的调优参数和GC日志分析,大致看一看,希望下次能多说一点吧。
GC常用参数
- -Xmn -Xms -Xmx -Xss
年轻代 最小堆 最大堆 栈空间 - -XX:+UseTLAB
使用TLAB,默认打开 - -XX:+PrintTLAB
打印TLAB的使用情况 - -XX:TLABSize
设置TLAB大小 - -XX:+DisableExplictGC
System.gc()不管用 ,FGC - -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintHeapAtGC
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCApplicationConcurrentTime (低)
打印应用程序时间 - -XX:+PrintGCApplicationStoppedTime (低)
打印暂停时长 - -XX:+PrintReferenceGC (重要性低)
记录回收了多少种不同引用类型的引用 - -verbose:class
类加载详细过程 - -XX:+PrintVMOptions
- -XX:+PrintFlagsFinal -XX:+PrintFlagsInitial
必须会用 - -Xloggc:opt/log/gc.log
- -XX:MaxTenuringThreshold
升代年龄,最大值15 - 锁自旋次数 -XX:PreBlockSpin 热点代码检测参数-XX:CompileThreshold 逃逸分析 标量替换 …
这些不建议设置
CMS日志
[GC (CMS Initial Mark) [1 CMS-initial-mark: 8511K(13696K)] 9866K(19840K), 0.0040321 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] //8511 (13696) : 老年代使用(最大)//9866 (19840) : 整个堆使用(最大)
[CMS-concurrent-mark-start]
[CMS-concurrent-mark: 0.018/0.018 secs] [Times: user=0.01 sys=0.00, real=0.02 secs] //这里的时间意义不大,因为是并发执行
[CMS-concurrent-preclean-start]
[CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] //标记Card为Dirty,也称为Card Marking
[GC (CMS Final Remark) [YG occupancy: 1597 K (6144 K)][Rescan (parallel) , 0.0008396 secs][weak refs processing, 0.0000138 secs][class unloading, 0.0005404 secs][scrub symbol table, 0.0006169 secs][scrub string table, 0.0004903 secs][1 CMS-remark: 8511K(13696K)] 10108K(19840K), 0.0039567 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] //STW阶段,YG occupancy:年轻代占用及容量//[Rescan (parallel):STW下的存活对象标记//weak refs processing: 弱引用处理//class unloading: 卸载用不到的class//scrub symbol(string) table: //cleaning up symbol and string tables which hold class-level metadata and //internalized string respectively//CMS-remark: 8511K(13696K): 阶段过后的老年代占用及容量//10108K(19840K): 阶段过后的堆占用及容量[CMS-concurrent-sweep-start]
[CMS-concurrent-sweep: 0.005/0.005 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] //标记已经完成,进行并发清理
[CMS-concurrent-reset-start]
[CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]//重置内部结构,为下次GC做准备
G1日志
[GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0015790 secs]
//young -> 年轻代 Evacuation-> 复制存活对象
//initial-mark 混合回收的阶段,这里是YGC混合老年代回收[Parallel Time: 1.5 ms, GC Workers: 1] //一个GC线程[GC Worker Start (ms): 92635.7][Ext Root Scanning (ms): 1.1][Update RS (ms): 0.0][Processed Buffers: 1][Scan RS (ms): 0.0][Code Root Scanning (ms): 0.0][Object Copy (ms): 0.1][Termination (ms): 0.0][Termination Attempts: 1][GC Worker Other (ms): 0.0][GC Worker Total (ms): 1.2][GC Worker End (ms): 92636.9][Code Root Fixup: 0.0 ms][Code Root Purge: 0.0 ms][Clear CT: 0.0 ms][Other: 0.1 ms][Choose CSet: 0.0 ms][Ref Proc: 0.0 ms][Ref Enq: 0.0 ms][Redirty Cards: 0.0 ms][Humongous Register: 0.0 ms][Humongous Reclaim: 0.0 ms][Free CSet: 0.0 ms][Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)][Times: user=0.00 sys=0.00, real=0.00 secs]
//以下是混合回收其他阶段
[GC concurrent-root-region-scan-start]
[GC concurrent-root-region-scan-end, 0.0000078 secs]
[GC concurrent-mark-start]
//无法evacuation,进行FGC
[Full GC (Allocation Failure) 18M->18M(20M), 0.0719656 secs][Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)], [Metaspace: 38
76K->3876K(1056768K)] [Times: user=0.07 sys=0.00, real=0.07 secs]
Linux常用命令
有道这边问我,你查看日志的时候涉及到哪些命令?
我说我们一般是使用可视化工具直接下载下来的,如果不能下载的话就cd,找到日志文件vim,如果太大打不开就使用命令查看前十行之类的(具体命令忘了)。
然后问我在文件中查找某个字段用哪个命令?不知道。
查看前十行:
head -n 10
后十行
tail -n 10
第3000行开始,向后1000行
cat filename | tail -n +3000 | head -n 1000
查找某个字段
grep 'word' filename
(果然是grep,当时应该猜一下的)
分布式事务
这个是腾讯PCG问的,当时忘记写下来了。之后看了看就2阶段提交、TCC、异步消息。具体的我已经更新在MySQL那一篇了。
分布式锁
这个是有道问的,问我分布式锁了解过吗?
我就回答了redis中的分布式锁,说了一下可能出现的问题比如时间过长需要设置过期时间、删除锁的时候删除了别人的锁所以需要设置锁名字。
然后他说,还有吗,别的分布式锁了解吗?
答,不会。
数据库的分布式锁
数据库的分布式锁是通过数据库的事务来实现的,当一个请求进入之后首选需要去锁(写锁)定数据库的某一个字段,然后等到处理完成之后再释放。
redLock
redis的分布式锁,当一个请求需要锁定资源的时候首先会设定一个锁的超时时间和有效时间,超时时间小于有效时间,然后向所有的redis尝试锁定这个资源,超过超时时间如果没有加锁成功则认为加锁失败。
如果超过一半的redis都加锁失败则认为这次加锁失败,释放已经锁定的所有资源。
如果超过一半的redis加锁成功,则认为加锁成功,锁的真正有效时间为(有效时间-最后一个redis返回加锁成功的时间)。
热更新和分布式
有道问的。
你们网吧项目每次更新都要停机对吧?那么有没有什么办法可以让他不停机呢?
我首先想到的是热更新,就说了OSGI,更新的时候把类加载器一同替换,这样就可以重新加载。
然后他说再想想,我想了一会没想出来,他说想想阿里他们怎么做的。
我说,他们肯定使用了高可用,阿里的话应该是一个集群,使用nginx进行代理,一台机器下线之后就用nginx把请求转发到另外一台机器上去。
他问我,nginx怎么配置?
答,不会。
Nginx如何配置
nginx有一个nginx.conf文件,所以使用nginx只需要对这个文件进行配置就可以了。
那么如何设置反向代理呢?
//表示对“/”开头的URL请求进行代理
location /{//代理的地址和端口号proxy_pass http://127.0.0.1:3000
}
如何设置负载均衡
upstream my_server_pool{//nginx有4中负载均衡算法,默认的是轮询,根据分配的权重进行轮询//字段从左到右分别为代理地址、权重、最大错误连接、请求失败后暂停服务时间server 127.0.0.1:3308 weight=1 max_fails=2 fail_timeout=30;server 127.0.0.1:3309 weight=2 max_fails=2 fail_timeout=30;
}
使用Nginx进行代理的还有一个好处就是可以解决跨域问题。
反问
腾讯这边问了下哪个部门,然后问他我哪里还可以提升。他说,时间太短看不出来。不过腾讯一共就面了30分钟,面试官还不是搞Java的,估计也面不出什么。
有道这边他说,你做的项目都是单机的,分布式的内容可以看一看,微服务、springCloud、kafka之类的。
没想到现在面试还要懂分布式了吗,想想也是,别人懂,你不懂,不就被筛了吗?哎,太卷了。
Seeker的奇妙求职历险(腾讯医疗一面和网易有道一面)相关推荐
- Seeker的奇妙求职历险(华为笔试)
矩阵报数 题目: 给出一个旋转矩阵,M行N列,左上角为(0,0),右下角为(M-1,N-1),从左上角开始计数,顺时针从外圈开始,外圈遍历完之后再遍历内圈,直到遍历完所有的点. 返回所有个位数为7且十 ...
- Seeker的奇妙求职历险(招银科技一面)
招银科技一面 前言 Redis 缓存雪崩 集合 锁 ReentranLock 可重入锁 公平锁 读写锁 数据库 Mybatis like语句注意事项 事务 子事务如何获取注解 事务传播行为 单例模式 ...
- Seeker的奇妙求职冒险(杰杰的字节笔试)
替换后的最长重复字符 力扣原题424:https://leetcode-cn.com/problems/longest-repeating-character-replacement/ 题目大意: 给 ...
- 51Talk进军AI教育,与腾讯、百度、网易有道等巨头一争高低
双减政策落地后,教培机构行业面临重大变化,从年初纷至沓来的各路玩家,到年中"避之不及"的资本出逃,行业的惊魂之变仅用了不到半年时间.而这场大动荡之下,新东方.巨人教育.学而思.好未 ...
- 腾讯医疗AI新突破:提出器官神经网络,全自动辅助头颈放疗规划 | 论文
来源:量子位 腾讯医疗AI实验室又有新研究. 这次跟美国加州大学合作,在国际权威期刊<Medical Physics>发表最新研究成果: <器官神经网络:深度学习用于快速和全自动整体 ...
- 腾讯医疗AI实验室:基于深度学习的放疗靶区自动勾画
每年有超过六十万人被诊断患有头颈部癌症,其中许多人选择接受放射治疗. 但头颈部重要器官比较集中,解剖关系复杂,如果在治疗前未仔细隔离,放疗时周围组织可能会严重受损. 腾讯医疗 AI 实验室和美国加州大 ...
- 腾讯医疗AI实验室:3篇论文被国际顶尖会议收录
近日,腾讯在医疗 AI 领域的学术研究获得实质性进展,旗下医疗 AI 实验室共有 3 篇论文分别被 KDD 2018.SIGIR2018 .COLING 2018 三个国际顶尖学术会议收录,论文的主要 ...
- 收割百度、阿里、腾讯、头条、网易华为等大厂Offer的面经
转载自 收割百度.阿里.腾讯.头条.网易华为等大厂Offer的面经 本文作者是跨专业考研的985硕士一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度 ...
- 腾讯企业邮箱、网易企业邮箱、gamail企业邮箱、TOM企业邮箱测评
这几年用企业邮箱的越来越多了,有一个企业自己的邮箱后缀,有助于企业树立鲜明统一的企业形象,客户觉得你专业会更快的促进成交.常见的企业邮箱品牌如腾讯企业邮箱.网易企业邮箱.gamail企业邮箱.TOM企 ...
最新文章
- 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...
- 近似算法的近似率_选择最佳近似最近算法的数据科学家指南
- matlab用for编写乘法表,实验二 Matlab程序设计基本方法1
- Spring IOC容器【p名称空间注入属性值 】
- datax 导入数据中文乱码_DataX在有赞大数据平台的实践
- [LeetCode] Majority Element II
- JAVA面试要点009---TimeUnit用法
- 有人说男人赚钱都是为了女人,这话说的有道理吗?
- java base64字符 转图片_JAVA实现图片与base64字符串之间的转换详解
- UPDATE语句更新的顺序
- Qualcomm Atheros ar9285 连不上 tp link无线 的 问题
- oracle系统漏洞补丁包,跪求oracle漏洞补丁包
- 网站收录有很多为什么没排名?解决办法
- Java:实现动态规划的4个经典题型,你都会吗?拒绝做优秀的码农
- C和C++的二进制,八进制,十六进制输出格式(全面版)
- 小程序源码:uni-app云开发的网盘助手
- 【附源码】Java计算机毕业设计旅游管理系统(程序+LW+部署)
- rest-assured的xmlPath使用方法总结
- 云网融合解决方案|快数据云管平台(CMP)最优解决方案
- 闲鱼自动抓取/筛选/发送系统, idlefish / xianyu spider crawler sender program blablabla
热门文章
- 【Python数据分析】文本情感分析——电影评论分析(二)
- 库克终于忍不住了!iPhone 8价格跳水跌至“白菜价”,网友:买早了
- Gluon.js配置、运行、打包
- 苹果8怎么投屏到电视_苹果怎么投屏到电视?简单操作就用这个办法
- ANALYZE 的用法
- 修改我的世界服务器怪物爆率,《我的世界》精英怪的掉落修改方法详解
- solr 请求参数过长报错,Solr配置maxBooleanClauses属性不生效原因分析
- java基于微信小程序的点餐外卖系统 uniapp 小程序
- 广电大数据用户画像及营销推荐策略(四)——Python实现
- linux数据库log文件太大,SqlServer日志文件过大的处理方法