在四面之前,出现了个小插曲。就是面试官上午估计是有跟我打过电话,但是貌似跟饿了么的外卖员跟我打电话冲突了「应该都是走的阿里的电话系统」,导致我压根没接到电话「外卖员还说给我打电话我一直不接,我说我压根没接到电话…」,最后还是下午5点的时候二面的面试官打电话给我叫我注意一下电话…我当时一脸懵逼…所以说关键时刻不要点饿了么外卖…….
然后约的 8 点半,但是我因为有携程的笔试推到了晚上 10 点半,然后 10 点我就开始坐在桌前等,说真的有点紧张,毕竟这面是交叉面,又是一个 P9 大佬…等啊等,一直等到晚上 11 点面试官都没有出现,我一度怀疑是我听错了时间,突然,11:04,面试官非常抱歉的打开时视频,终于看到了…于是面试正式开始…
视频面。有点太晚了,所以自己在面之前也是有跟面试官交代,可能反应会慢一些…面试官还是非常理解的,然后这一面可以说是这半个多月来面的最棒的一次了,下面是主要内容:
面试依旧是从项目出发,注意,阿里后面四面基本上全部围绕项目展开,所以务必要有一个吃透的项目,了解其中用到的技术栈,并且延伸到操作系统级别的调用,同时要关注项目中遇到的难点以及自己是如何解决的,这是最最最高频的问题了,基本上每一面的面试官都有问这个问题。
同时,一定要将项目中的某些部门转移到自己擅长的领域,比如我讲的项目中其实就是一个爬虫项目,但是可以扩展的地方太多了,我就举几个例子:
讲到爬虫,那务必要讲反爬措施,这是一个可以展开的点,可以讲很久,讲反爬如何解决;
中间件用到kafka,这又是一大块可以讲的,kafka 的通信机制,以及内部构造,以及高可用机制和吞吐量大;
谈到 kafka 的吞吐量大,又可以总结一波为何吞吐量大,然后延伸到 NIO 和 零拷贝技术,又可以讲一堆;
讲到 NIO,又可以讲 IO 那一大块知识点,同时谈到 NIO 必定会谈到 select/epoll,这样又可以讲很多。
总之,这些知识,自己都是可以提前准备好的,然后到时候面试抛出来就行了,面试官一般都会顺着你的思路进行下去的,要把话语权掌握在自己的手上,一定要记得特意的抛出某些知识点「这里的特意是指跟你的项目挂钩的」
同时,我发现从三面到四面,都有去关心,自己在项目中用到的设计模式以及自己看源码发现的一些设计模式。
我之前只准备了三种设计模式,并且自己亲自写了一些小demo:
单例模式,四面就问了这个,谈什么是饿汉模式和懒汉模式;
// 饿汉
public class Singleton { // 类加载时就初始化 private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance(){ return instance; } }
| copy
// 懒汉
public class Singleton { private static Singleton instance; private Singleton () {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
模板方法模式,这个是IO延伸过来的知识点,然后我顺带提了一下 AQS;
IO 和 AQS 都用了模板方法的设计模式。
代理模式,提了一下动态代理,以及Spring中的 AOP。
上面已经总结了
然后就是一些比较简单的问题:
为何要分新生代和老年代,如何区分的?
这个我在《深入理解java虚拟机笔记》中有非常详细的谈到,并且我在 “腾讯二面”这部分也有很详细的总结!可以往上翻翻看到。
Full gc 如何排查?
先看一下相关的图形化界面,看每一次 full gc后对象的存活率
如果存活率高,可能是老年代的内存太小了,导致很容易触发 full gc;
如果存活率低,说明可能是很多大对象进入到老年代区域,主要是可能自己代码写的有点问题,或者说明可能是 eden 区太小了,导致年轻代很容易就进入了老年代区域。
讲一讲 synchronized 和 Lock 的区别,以及 ThreadLocal?
Synchronized 和 lock 最典型的几个区别:
synchronized 关键字,jvm层面;lock 是类,jdk层面;
synchronized 不支持中断,lock支持;
synchronized如果阻塞了会一直等待,而lock可以定时取消等待;
synchronized只能有一个条件队列,而lock可以有多个。
ThreadLocal 主要谈到 ThreadLocalMap,注意它是线性探测法解决的冲突,并且加载因子为2/3,初始值16,当然还得谈到其内存泄漏问题,解决方案就是使用弱引用以及用一些方法处理脏 Entry ,当然并不能完全避免内存泄漏,但是只要你不和线程池搞在一块就应该不会产生内存泄漏。
网络中的加密算法有了解吗?
必须了解。
从https「上面已经讲过了」,到 RSA 加密算法,再到对称非对称加密算法,再到 token 等等。
讲讲非对称和对称加密算法「这块我讲了md5算是,很明显面试官说不是」
严格来说:MD5、sha-1只是散列算法,或者叫摘要算法,不能算加密算法。
也就是说,MD5 是不可逆的,你根本解不了,而对称非对称加密算法是可逆的,可以通过密文得到明文,也可以通过明文得到密文。
加密对应解密,即加密后的密文可以解密成明文,但是MD5无法从密文(散列值)反过来得到原文,即没有解密算法。
大家知道加密算法分为对称加密和非对称加密,不管对称加密和非对称加密,都是能够从密文解密得到明文的。从这点上讲MD5不是加密算法,更谈不上属于对称加密、非对称加密。所以不要再讨论MD5是属于对称加密、非对称加密了,MD5既不属于对称加密也不属于非对称加密,MD5根本就没法解密,也没有秘钥(加盐并不是秘钥),所以可以认为MD5不属于加密算法。
一些人认为MD5处理后看不到原文,即已经将原文加密,所以认为MD5属于加密算法。如果这么看的,那么求余也可以算加密算法了。
作者:GeCoder 链接:https://www.zhihu.com/question/68735830/answer/327762693来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
所以,md5 并不是加密算法,那典型的加密算法有哪些呢?
加密技术通常分为两大类:”对称式”和”非对称式”。
**对称性加密算法:**对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。
**非对称算法:**非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为”公钥”和”私钥”,它们两个必需配对使用,否则不能打开加密文件。发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
**散列算法:**散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的”散列”或”消息摘要”(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。
对称性加密算法有:AES、DES、3DES用途:对称加密算法用来对敏感数据等信息进行加密
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;AES是一个使用128为分组块的分组加密算法,分组块和128、192或256位的密钥一起作为输入,对4×4的字节数组上进行操作。众所周之AES是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。
非对称性算法有:RSA、DSA、ECC
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。RSA在国外早已进入实用阶段,已研制出多种高速的RSA的专用芯片。
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法。
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。ECC和RSA相比,具有多方面的绝对优势,主要有:抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
散列算法(签名算法)有:MD5、SHA1、HMAC用途:主要用于验证,防止信息被修。具体用途如:文件校验、数字签名、鉴权协议
MD5:MD5是一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。
SHA1:是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。而SHA-1基于MD5,MD5又基于MD4。
HMAC:是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC是需要一个密钥的。所以,HMAC_SHA1也是需要一个密钥的,而SHA1不需要。
其他常用算法:
Base64:其实不是安全领域下的加密解密算法,只能算是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,对数据内容进行编码来适合传输(可以对img图像编码用于传输)。这是一种可逆的编码方式。
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL(SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。),因此加密的详细内容就需要SSL。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间),提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。Https 就可以使用上面的对称加密算法和非对称加密算法进行消息的加密。
项目应用总结:
加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证。
对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。
非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。
Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。
https协议广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
MD5标准密钥长度128位(128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32位。16位加密就是从32位MD5散列中把中间16位提取出来);sha1标准密钥长度60位(比MD5摘要长32位),Base64转换后的字符串理论上将要比原来的长1/3。
以上内容来自于:https://www.cnblogs.com/sochishun/p/7028056.html
个人理解的对称加密算法的过程:
A 与 B 商定好加密算法,然后 A 如果给 B 发消息,会先运用加密算法,进行加密,B 收到后,会运用逆加密算法,进行解密,也就是其密钥是一样的。
个人理解的非对称加密算法的过程:
A 和 B 各自拥有一对公钥和私钥,也就是说二者发送消息的加密算法可以互不相同,且对方可以不用知道。例如 A 要给 B 发消息,要拿到 B 的公钥,然后进行加密即可,B 收到后用自己的私钥就可以解开了。
介绍BIO、NIO、AIO
这个简单…详细的叙述见我 《零拷贝及其周边》
BIO:普通的同步阻塞 I/O
NIO:同步非阻塞 I/O
AIO :异步非阻塞 I/O
虚拟内存
这个是知识盲区,需要好好科普一下。
我的天啊!!!!自己的《零拷贝及其周边》早就介绍过虚拟内存,面试的时候竟然没有想起来,还知识盲区呢???真的是智障啊啊啊啊。。。。。这个没答上来真的太可惜了,不过还好面试官没有深究…
虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间)。而实际上,虚拟内存通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换,加载到物理内存中来。目前,大多数操作系统都使用了虚拟内存,如 Windows 系统的虚拟内存、Linux 系统的交换空间等等。
离开进程谈虚拟内存没有任何意义,不同进程里的同一个虚拟地址指向的物理地址是不一样的。每个用户进程维护了一个单独的页表(Page Table),虚拟内存和物理内存就是通过这个页表实现地址空间的映射的,页表(Page Table)里面的数据由操作系统维护。
引入虚拟内存的好处
在进程和物理内存之间,加了一层虚拟内存的概念,好处有:
提供更大的地址空间,因为虚拟内存还可以放在磁盘上或者寄存器中,而物理内存并不行,而且虚拟地址空间是连续的,我们不需要操心具体是如何存放的,操作系统会帮我们映射好;
安全性更好,虚拟内存设有读写属性,并且不同进程互不影响;
可以懒加载,只有在需要读相应的文件的时候,才将它真正的从磁盘上加载到内存中来,而在内存吃紧的时候又可以将这部分内存清空掉,提高物理内存利用效率,并且所有这些对应用程序是都透明的;
可以共享内存,动态库只需要在内存中存一份就够了,然后将它映射到不同进程的虚拟地址空间中,让进程觉得自己独占了这个文件。进程间的内存共享也可以通过映射同一块物理内存到进程的不同虚拟地址空间来实现共享。
如果想了解更底层的话,戳链接:https://sylvanassun.github.io/2017/10/29/2017-10-29-virtual_memory/#comments
话说最拿手的数据库竟然一点都没问,感觉有点意犹未尽哈哈哈哈哈…
就是正常的聊天
自我介绍
做的项目讲一下,在里面的职责
然后就是介绍我要去的部门和架构组了
等offer,希望一切好运!!!
不知道五一大家有出去玩吗,乔戈里疫情以来第一次出去玩,感觉出去看看风景真滴舒服啊,比呆在家里好一些,有机会还是出去溜达溜达吧,记得带好口罩.(学弟还拿到了腾讯的offer,如果这篇在看超过100,我再和学弟要一下,在看别忘记呀~~~ 点击阅读原文,直达学弟博客)