HeapDump性能社区专题系列四:后端面试必备问题集原创
一元复始,万象更新。春节结束,一切又是新的开始。马上就到“金三银四”了,有跳槽打算的工程师,一定已经开始偷偷努力了吧!今天堆堆帮大家整理了一些或经典或刁钻的面试题,以及一些难点解析,希望能帮大家查漏补缺,拿到心仪的offer~
1.面试官问我:什么是高并发下的请求合并?
作者:why技术
前段时间一个在深圳的,两年经验的小伙伴出去面试了一圈,收割了几个大厂 offer 的同时,还总结了一下面试的过程中遇到的面试题,面试题有很多,文末的时候我会分享给大家。
这次的文章主要分享他面试过程中遇到的一个场景题:
他说对于这个场景题,面试的时候没有什么思路。
说真的,请求合并我知道,高并发无非就是快速的请求合并。
但是在我有限的认知里面,如果类似于秒杀的高并发扣库存这个场景,用请求合并的方式来做,我个人感觉是有点怪怪的不够传统。
在传统的,或者说是业界常用的秒杀解决方案中,从前端到后台,你也找不到请求合并的字样。
我理解请求合并更加适用的场景是查询类的,或者说是数值增加类的需求,对于库存扣减这种,你稍不留神,就会出现超卖的情况。
当然也有可能是我理解错题意了,看到高并发扣库存就想到秒杀场景了。
但是不重要,我们也不能直接和面试官硬刚。
我会重新给个我觉得合理的场景,告诉大家我理解的请求合并和高并发下的请求合并是什么玩意。
2.面试官:你给我说一下什么是时间轮吧?
作者:why技术
你好呀,我是歪歪。
今天我带大家来卷一下时间轮吧,这个玩意其实还是挺实用的。
常见于各种框架之中,偶现于面试环节,理解起来稍微有点难度,但是知道原理之后也就觉得:
大多数人谈到时间轮的时候都会从 netty 开始聊。
我就不一样了,我想从 Dubbo 里面开始讲,毕竟我第一次接触到时间轮其实是在 Dubbo 里面,当时就惊艳到我了。
而且,Dubbo 的时间轮也是从 Netty 的源码里面拿出来的,基本一模一样。
3.面试官:你给我说一下线程池里面的几把锁。
作者:why技术
最近有个读者给我说,面试聊到线程池的时候,相谈甚欢,基本都回答上来了,但是其中有一个问题直接把他干懵逼了。
面试官问他:你说一下线程池里面的锁吧。
结果他关于线程池的知识点其实都是在各个博客或者面经里面看到的,没有自己去翻阅过源码,也就根本就没有注意过线程池里面还有锁的存在。
他还给我抱怨:
他这么一说,我也觉得,好像大家聊到线程池的时候,都没有怎么聊到里面用到的锁。
确实是存在感非常低。
要不我就安排一下?
4.《我想进大厂》之mysql夺命连环13问
作者:艾小仙
1.能说下myisam 和 innodb的区别吗?
2.说下mysql的索引有哪些吧,聚簇和非聚簇索引又是什么?
3.那你知道什么是覆盖索引和回表吗?
4.锁的类型有哪些呢?
5.你能说下事务的基本特性和隔离级别吗?
6.……
5.《我想进大厂》之Redis夺命连环11问
作者:艾小仙
1.说说Redis基本数据类型有哪些吧
2.Redis为什么快呢?
3.那为什么Redis6.0之后又改用多线程呢?
4.知道什么是热key吗?热key问题怎么解决?
5.什么是缓存击穿、缓存穿透、缓存雪崩?
6.……
6.JVM经典面试20问
作者:程序员大彬
- 讲一下JVM的内存结构?
- 说一下堆栈的区别?
- 什么情况下会发生栈溢出?
- 类文件结构
- 什么是类加载?类加载的过程?
- ……
7.面试官:cglib为什么不能代理private方法?
作者:看点代码再上班
你用过Spring么?听说过Spring AOP么?肯定都有吧!今天就说一说Spring AOP里面的一种代理方式cglib的原理,以及顺便回答一下cglib为什么不能代理private方法。
8.Java多线程知识小抄集(一)
作者:朱小厮
本文主要整理笔者遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。
9.据说99.99%的人都会答错的类加载的问题
作者:你假笨
首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题。
- 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗
请仔细注意上面的描述里几个关键的词
- 同一个类加载器:意味着不是每次都new一个类加载器对象,我知道有些对类加载器有点理解的同学肯定会想到这点。我们这里强调的是同一个类加载器对象去加载。
- 同一个类文件:意味着类文件里的信息都一致,不存在修改的情况,至少名字不能改。因为有些同学会钻空子,比如说拿到类文件然后修改名字啥的,哈哈。
- 多个Class对象:意味着每次创建都是新的Class对象,并不是返回同一个Class对象。
都可以被java层使用:意味着Java层能感知到,或许对我公众号关注挺久的同学看过我的一些文章,知道我这里说的是什么,不知道的可以翻翻我前面的文章,这里卖个关子,不直接告诉你哪篇文章,稍微提示一下和内存GC有关。
那接下来在看下面文章之前,我觉得你可以先思考一个问题,
同一类加载器对象是否可加载同一类文件多次且得到多个不同的Class对象(单选)
A.不知道 B.可以 C.不可以
虽然有些标题党的意思,不过我觉得标题里的99.99%说得应该不夸张,这个比例或许应该更大,不过还是请认真作答,不要随便选,我知道肯定有人会随便选的,哈哈。
10.Java层面调用native方法是怎么找到本地库中对应方法的?
作者:RednaxelaFX
问:在Java代码上调用了一个本地方法,比如调用某个对象的getClass()本地方法,那么在java层面调用开始到找到本地库中的如下方法?
JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
if (this == NULL) {
JNU_ThrowNullPointerException(env, NULL);
return 0;
} else {
return (*env)->GetObjectClass(env, this);
}
}
这期间到底发什么了什么?怎么找到这个本地方法的,相关vm代码在哪里呢?