杭州端点科技两轮面试总结,共勉

端点科技的面试是我觉得几次实习试炼面试中自我感觉比较有干货的面试(还有百应科技),因为问场景问的比较多,下面是记得的几个面试题,在这里分享给大家:

第一面(8月26日)+第二面(9月1日)

因为上一面没有具体去做整理,所以就把两面归结到一起去整理了

1、自我介绍~~

(不在赘述,放开的讲,不要紧张,尽量说出自己学到的一些东西和收获,能突出自己亮点的)

2、TCP和Http的区别是什么?

大致讲了下网络七层模型和tcp四层模型,tcp是在传输层,是传输层协议,http是在应用层,http协议其实也是依赖于tcp协议,就讲了下http网址访问的大致过程

TCP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。TCP/IP和HTTP协议的关系,从本质上来说,二者没有可比性,我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,这时候应用层协议http就产生了

3、讲一下tcp三次握手,说一下tcp和udp的区别?

tcp三次握手:
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

tcp和udp的区别
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

4、讲一下你对http和https的认识

还好之前补看了一些网络知识;http是超文本网络传输协议,信息是明文加密,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全,讲了下对称加密算法和非对称加密算法,为了保证数据传输安全性的条件下引进第三方权威CA证书,两者的区别还有就是http的网络端口号是80,https是443。详细认识和区别在下:
【https://blog.csdn.net/qq_38289815/article/details/80969419】

5、那你知道http3吗?

直接懵逼~~~ 不知道。下来的搜了一下。

HTTP/3 是即将到来的第三个主要版本的 HTTP 协议,使用于万维网。在 HTTP/3 中,将弃用 TCP 协议,改为使用基于 UDP 协议的 QUIC 协议实现。QUIC(快速 UDP 网络连接)是一种实验性的传输层网络传输协议,由 Google 开发,该协议旨在取代 TCP 协议,使网页传输更快。

6、线程池场景,说下线程池几个参数的意义

corePoolSize 线程池核心线程大小、
maximumPoolSize 线程池最大线程数量、
keepAliveTime 空闲线程存活时间、
workQueue 工作队列、

面试官: 假设我们现在用newFixedThreadPool,设置核心线程数为5,最大线程数为10,那么线程数到5了以后是进行什么操作,你可以从线程池一开始创建开始讲起。

我: 线程池在一开始创建的时候就会先创建5个空闲线程在里面,然后有任务用到线程就会从这5个里面取,用完以后会放回去,如果5个线程都在用,那么来的任务会加到阻塞队列中

面试官: 那么阻塞队列满了以后呢?

我:满了就会从最大线程数中取,也就是核心线程数+1,最后进行比较corePoolSize大小与maximumPoolSize的大小,如果线程池中的线程数量大与corePoolSize 时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize,若相等了,那么就会触发拒绝策略,不接受任务了,

面试官:那么,默认的决绝策略是什么呢?

我:(忘记了。)

面试官:忘记了没事的,你可以下去看一下
四种拒绝策略:
1、CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大
2、AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
3、DiscardPolicy - 直接丢弃,其他啥都没有
4、DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入
线程池默认的拒绝策略:一般直接使用 ExecutorService 的时候,都是使用的默认的 defaultHandler ,也即 AbortPolicy 策略。

6、线程和进程的区别?

进程是资源分配的最小单位,线程是CPU调度的最小单位,一个进程可以包含多个线程,一个进程可以是一个app,线程可以是app内的很多功能,火车和车厢也可以做比喻

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。转自https://blog.csdn.net/kuangsonghan/article/details/80674777,感觉讲的超棒,望大家收藏,若博主介意转文,会立改】

7、那两个线程对一块内存的变量访问或者更改,会出现什么问题?或者是对一个共享变量进行访问时,其他线程可见吗?

我:肯定会有数据不安全的问题,这让我想到了关键字volatile,保证共享变量的可见性,不会引起上下文的切换和调度,volatile实现的两个实现原则是:
(1)lock前缀指令会引起处理器缓存会写到内存
(2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效

还有一种保证线程安全的就是加synchronized,也能保证线程做操作时的安全性

8、数据库查询一个字段的重复量,以及重复量大于3的记录

(1)select name ,count(*) from stu group by name
(2)select * from stu where name in (select name from stu group by name having count(name>3))

9、jvm垃圾回收算法,如果A对象引用到B,B对象引用到A,那么会触发gc吗?

我想了一下,回答了不会出发,因为有引用,因为存在被引用,gc会过略掉,不会被回收,但是又想了想还是觉得哪里不对劲(菜鸡的犹豫很恐怖)可能一时间只想到了引用计数法,没有想到可达性分析,判断对象是否存活的方法有引用计数法和可达性分析,现在主流的java虚拟机不采用引用计数法了,因为引用计数法无法通知GC收集器回收他们,但是可达性分析可以做到:
可达性分析: 从根(GC Roots)的对象作为起始点,开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
GC Roots:
• java虚拟机栈中引用的对象
• 本地方法栈中引用的对象
• 方法区中静态变量引用的对象
• 方法区中常量引用的对象
所以两个对象互相引用,但是如果没有一条通往gc roots 的引用链的话,说明该对象是是不可用的,还是会被gc回收的。

10,那你知道为什么年轻代的垃圾回收会快一点,老年代的对象清理会慢一点呢?

容我小想一下,年轻代用的是minor GC,老年代用的是Full GC,我记得优化里一方面提到了对垃圾回收算法的优化可以尽量减少Full GC的发生次数,也就是说老年代垃圾对象回收应该是比较慢,比较耗时的,emmm想一下,对了,年轻代用到的垃圾回收算法是复制清除,两块survivor区,而老年代用的是标记整理,是要整理所有存活对象的引用地址,把他们移动到内存的一端,在对末端内存地址以后的内存全部回收,所以相比于对象的复制,对象移动整理是更耗时,效率较低的,所以清理对象会比较慢。

11、数据库连接池应该设置多大合适?

我:100?

面试官:那你觉得为什么会设置成100呢?

我:懵逼中。。。会不会跟IO,业务场景的请求数的并发量吞吐量有关?所以业务并发场景偏小点的所以设置的比较小?。

面试官:就假设现在有千万级别的并发访问量,那你的连接数要增加吗?

我:不能瞎猜了,下来查了下。

【数据库连接数maxActive与
CPU
磁盘IO
网络IO
这三方面有关,一定要切记不是设置越大越好,连接数设置过大还会影响请求响应时间,即使是单核CPU的计算机也能“同时”运行数百个线程。但我们都应该知道这只不过是操作系统用时间分片玩的一个小把戏。一颗CPU核心同一时刻只能执行一个线程,然后操作系统切换上下文,核心开始执行另一个线程的代码,以此类推。给定一颗CPU核心,其顺序执行A和B永远比通过时间分片“同时”执行A和B要快,这是一条计算机科学的基本法则。一旦线程的数量超过了CPU核心的数量,再增加线程数系统就只会更慢,而不是更快。
最后总结来说数据库连接池的大小最合适的设置为:((核心数 * 2) + 有效磁盘数)最佳。】

11、Mysql中什么时候加索引,在条件中加大于,小于或者等于会影响索引的命中和查询效率吗?字符串可以加索引吗?
like模糊查询,前缀,中间,后缀查询会走索引吗?那种最快?

先介绍下什么是索引吧:
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
所以表如果比较小,就可以扫描整个表,无需添加索引,如果表比较大,查询的字段也是我们经常要去查询的,那么我们就可以建立索引,有唯一索引,联合索引(索引覆盖)等,都可以是我们查询的速度得到提升,不会去扫描全表,联合索引遵最左前缀原则,(明天更~)

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值