前言
了解 JVM 是对 Java 开发人员的基本要求,JVM 的相关内容自然也成了现在 Java 程序员面试的重要考点。不过估计很多小伙伴和我一样,长时间醉心于 CRUD,却忘了去了解一下更底层、更基础的东西,殊不知这些才是决定你能在这条路上走多远的关键因素,那接下来我们就一起来深入学习一下看似神秘的 JVM 吧。JVM 总体来看内容还是很多的,我会把最重要的内容介绍给大家,不过如果你有时间和精力的话,还是推荐你去看一下《深入理解Java虚拟机》这本书,确实是有口皆碑。本文也会引用很多此书的内容并加上我自己的理解,如果你坚持看下去的话,相信会有很大的收获。
首先对 JVM 做个简单的介绍,JVM 是 JDK 的一部分,《Java 虚拟机规范》(The Java Virtual Machine Specification) 是平行于《Java 语言规范》(The Java Language Specification)的一套独立的规范,不同的公司对其有不同的实现 (类似于一个接口被不同的类实现),比较著名的 Java 虚拟机实现版本有 HotSpot、JRockit 和 J9 等。
复习过程
- 项目准备;
- leetcode:刷完剑指之后每天会刷2-4道leetcode
- java基础: 主要刷面经、重点掌握垃圾回收机制
- 操作系统: 之前没学过,用几天时间看了一下最重要的进程线程、死锁、消费者生产者、哲学家问题、银行家算法
- 计算机网络:花几天时间复习了一下,重点复习tcp(三次握手四次挥手拥塞控制流量控制)、udp、https
- 数据库: 重点了解了索引的实现以及引擎的区别
- 数据结构和算法: 主要通过剑指offer和leetcode进行复习
- 其他:期间也做过大大小小好几次笔试,还有一些往届练习卷
腾讯
一面(3.13电话面)
- 自我介绍
- 介绍项目以及项目遇到的难点
- java的hashmap是否安全?hashmap、hashtable、concurrenthashmap的区别、底层和实现
- mysql索引的底层实现
- jvm垃圾回收机制
- tcp、udp区别和适用场景
- tcp三次握手、四次挥手,为什么挥手不能只有三次
- 线程和进程的区别
- 进程通信的方式有哪些
- 堆是线程共有还是私有,堆是进程共有还是私有,栈呢
- 了解过协程吗(我:携程???不了解呜呜呜)
- mysql查询优化
- 快速排序的时间复杂度、原理(口述算法)
- 最近在看什么书
- 除了腾讯还投了其他的公司吗
- 问我愿不愿意转go,并推荐我了解一下协程,最后让我耐心等待,面试的人太多,需要对面试的同学进行挑选,两周内会告知我结果
- 有什么想问的(对我的评价和学习建议)
二面(3.22现场面)
- 自我介绍
- 问我为什么发现自己不喜欢做客户端(简历中有一个安卓实习项目)而想做后台
- 介绍项目(一个电商小程序)
- 项目中的商品是否有考虑过xxx(忘记叫什么了,意思就是是否有考虑过同一种商品有不同的颜色、规格,在数据库中如何区分这些不同)
- 介绍项目的支付流程,并画一下流程(白板)
- 介绍一下订单状态码的含义,以及交易过程中订单状态码如何变化
- 如何防止商品的超卖现象
- 项目是否具有秒杀功能
- 并发的时候,如何保证性能
- 在分库之后,如何设计id
- 在分库后,一条插入请求,在上层不做处理,如何直接在数据库找到相应的库并插入库中的某个表
- 当服务器的cpu一直很高时,如何找出原因
- 是否用过调试工具
- 当项目一直无法访问的时候,如何定位错误
- 介绍一下aop和ioc
- 如何将一个ip地址由点分制(xxx.xxx.xxx.xxx)和int类型间进行相互转化
- 如何判断一个数是否为2的n次方
- 可实习时间
- 是否愿意转go
- 有什么想问的(对我的评价和学习建议)
hr面(3.26电话面)
- 自我介绍
- 介绍一下实习经历
- 实习中遇到的困难以及如何解决这些困难
- 未来计划,是否读研
面试总结
一面的问题都很中规中矩,唯一卡住的就是协程了,确实不会,只能和面试官说我不了解。
主要和大家分享一下二面的面试体验吧。因为二面自我感觉答得不是很好,有很多问题当时没记录下来,现在一时也想不起来。所以上面的面经并不完整。
当时面试完走出大厦以为自己挂掉了,结果刷新了一下状态发现变为hr面,真的超级意外。现在想想大概是因为我在遇到不会的问题时,没有直接说自己不会,尽量把答案往自己知道的方向回答。
- 第7题,项目没有秒杀功能我也没做过,但是了解过一些,只能和面试官说确实没有,然后让他听我讲一下我的实现思路,期间又让面试官挖出了很多问题考我TAT
- 第9题、第10题,面试官要求我在分库的场景下回答问题,我先回答了分表情况下如何实现,他肯定了我在分表下的做法,但是分库情况还需要另外考虑,我实在想不出来,才和他说自己没有办法实现,但这总比我直接说自己不会好。
- 第13题,如何定位错误的时候,先讲了一下无法访问的几种情况,以及大量tcp处于time_wait、close_wait这两种状态的原因和解决方法。
- 面试结束后,等电梯的时候突然想起面试中一个一直理解错误导致解不出的问题,发现自己想歪了之后赶紧编辑完答案又给面试官发了过去,这个答案后来得到了面试官的认可。
最后
为什么我不完全主张自学?
①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。
除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。
我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
企业的要求?(下图总结)**
[外链图片转存中…(img-N0cjEzLm-1651994475156)]
[外链图片转存中…(img-Kh5jyurr-1651994475158)]