百度后端面试题知识点总结

时间:2022-04-07 01:11:51

四种线程池拒绝策略

(1)AbortPolicy

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现。

(2)DiscardPolicy

ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。

使用此策略,可能会使我们无法发现系统的异常状态。建议是一些无关紧要的业务采用此策略。

(3)DiscardOldestPolicy

ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。

(4)CallerRunsPolicy

ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务,此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。

AOP术语

1. 连接点(Joinpoint)

连接点描述的是程序执行的某个特定位置。如一个类的初始化前、初始化后,或者类的某个方法调用前、调用后、方法抛出异常后等等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些特定点就称为连接点。连接点用来定义在目标程序的哪里通过AOP加入新的逻辑。

2. 切入点(Pointcut)

切入点是一个连接点的过滤条件,AOP 通过切入点定位到特定的连接点。。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点。

3. 通知(Advice)

切面在某个具体的连接点采取的行为或行动,称为通知。切面的核心逻辑代码都写在通知中,有人也称之为增强或者横切关注点。通知是切面功能的具体实现,通常是业务代码以外的需求,如日志、验证等,这些被模块化的特殊对象。

4. 通知器(Advisor)

通知器由一个切入点(pointcut)和一个通知(Advice)组成。

垃圾收集器

百度后端面试题知识点总结

新生代收集器:Serial、ParNew、Parallel Scavenge;

老年代收集器:Serial Old、CMS、Parallel Old;

通用收集器: G1;

常用组合:Serial+Serial Old, Parallel Scavenge+Parallel Old,ParNew+CMS,G1(不需要组合其他收集器)。

Java程序初始化的遵循的三个原则

以下三个原则优先级依次递减:

1、静态对象(变量 )优先于非静态对象初始化,其中,静态对象(变量)只初始化一次,而非静态对象可以初始化多次。

2、父类优先于子类进行初始化

3、按照成员变量定义顺序进行初始化

具体顺序:

        1.父类静态变量

        2.父类静态代码块

        3.子类静态变量

        4.子类静态代码块

        5.父类非静态变量

        6.父类非静态代码块

        7.父类构造方法

        8.子类非静态变量

        9.子类非静态代码块

        10.子类构造方法
 

分布式锁的实现方式

目前分布式锁的实现方案主要包括三种:

  • 基于数据库(唯一索引)

  • 基于缓存(Redis,memcached,tair)

  • 基于Zookeeper

磁盘调度算法

1、先来先服务

磁盘调度的最简单形式当然是先来先服务(FCFS)算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。

2.最短寻道时间优先(SSTF)

在移动磁头到别处以便处理其他请求之前,处理靠近当前磁头位置的所有请求可能较为合理。这个假设是最短寻道时间优先(SSTF)算法的基础。

SSTF 算法选择处理距离当前磁头位置的最短寻道时间的请求。换句话说,SSTF 选择最接近磁头位置的待处理请求。

3.电梯算法(scan)

对于扫描算法,磁臂从磁盘的一端开始,向另一端移动;在移过每个柱面时,处理请求。当到达磁盘的另一端时,磁头移动方向反转,并继续处理。磁头连续来回扫描磁盘。SCAN 算法有时称为电梯算法,因为磁头的行为就像大楼里面的电梯,先处理所有向上的请求,然后再处理相反方向的请求。

shell脚本中

shell脚本中,需求如下:如果 ls /tmp 执行成功输出True,否则输出Fail,下列哪项正确

  • ls /tmp; [[ $# -eq 0 ]] && echo True || echo Fail
  • ls /tmp; [[ $* -eq 0 ]] && echo True || echo Fail
  • ls /tmp; [[ $0 -eq 0 ]] && echo True || echo Fail
  • ls /tmp; [[ $? -eq 0 ]] && echo True || echo Fail

解释:

  • ls /tmp: 执行ls命令来检查/tmp目录是否存在
  • $?: 是上一个命令的返回值。如果ls命令执行成功,则返回值为0;否则返回值为非零值。
  • [[ $? -eq 0 ]]: 如果上一个命令的返回值为0,即ls命令执行成功,则条件成立。
  • &&: 是逻辑与操作符。如果前一个命令成功执行,则执行后一个命令。
  • echo True: 如果ls命令执行成功,则输出True。
  • ||: 是逻辑或操作符。如果前一个命令执行失败,则执行后一个命令。
  • echo Fail: 如果ls命令执行失败,则输出Fail。

选项 A 中的$#表示命令行参数个数,而不是上一条命令执行结果的状态码。

选项 B 中的$*表示所有命令行参数的字符串,而不是上一条命令执行结果的状态码。

选项 C 中的$0表示脚本名字,而不是上一条命令执行结果的状态码。

选项 D 中的$?表示上一条命令执行的状态码,如果状态码为 0,表示命令执行成功,否则表示执行失败。因此这个选项是正确的。

linux指令

linux命令中cat、more、less、tail、head均可用来查看文件内容,主要区别有:

cat是一次性显示整个文件的内容,适用于文件内容少的情况;

more和less一般用于显示文件内容超过一屏的内容,并且提供翻页的功能。

tail 和 head分别显示文件的后几行和前几行内容。常用于大文件的截取。

网络安全

由于前端直接可被用户访问,攻击者可以轻易得到页面和通讯过程中的相关信息,进而进行恶意的攻击,关于其攻击的方式描述正确的有哪些?

A

假定站点 foo.com 的服务器架设在公司内网,提供了任意站点截图服务 foo.com/screenshot?url=xxx,恶意修改 url 中的值为内网地址,构成 SSRF 攻击,进而造成数据泄露的风险

B

网站 foo.com 提供 POST 方法的 /tansfer/to/xxx 的转账服务,由于未做 CSRF 的防范,被攻击者重复伪造该请求,形成重放攻击,造成经济损失

C

网站 foo.com 使用了非安全的 HTTP 协议,其中转账服务 POST /transfer/to/xxx,转账金额 money 在 payload 上,假定接口层面采用了随机 token 来防范 csrf 攻击,接口参数未做签名校验,此时攻击者通过篡改 money 的数值,构成中间人攻击

D

借助社会工程学的理论基础,基于用户的贪婪等心理,制作一个 qq.com 的”冒牌”中奖页面,诱导用户输入账号密码进行登录,造成隐私的泄露,属于”钓鱼”的网络欺诈行为

正确答案:ABCD

百度后端面试题知识点总结

tcp粘包

tcp发送报文数据时,可能将多个数据包合并成一个大的数据包发送,就有可能发生粘包问题。如何解决?
 

答:

出现粘包,主要是tcp为了提高效率,每次都要等足够长的数据才进行发送,接收方要等到足够长的数据才从缓冲区提取。解决的办法就是只要能把包分开就不影响传输。

A:固定长度,肯定可以;

B:分隔符

D:添加长度信息。