lukaliou123 / lukaliou123.github.io

lukaliou123在2022年的面试用知识点总结
Other
5 stars 0 forks source link

面经补充 #15

Open lukaliou123 opened 2 years ago

lukaliou123 commented 2 years ago

1.数据库 联合索引 用法

MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。联合索引使用了最左匹配原则,当遇到范围查询(>、<、between、like)就会停止匹配 具体原因为: MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。 实际上一个联合索引,建立了(name)(name,age)(name,age,school)三个索引 当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。

lukaliou123 commented 2 years ago

2.Spring IOC初始化过程

image IOC是一种设计思想

lukaliou123 commented 2 years ago

3.synchronized 和 ReentrantLock 区别是什么?

synchronized 是和 if、else、for、while 一样的关键字ReentrantLock 是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量

synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进

两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 image

主要区别: ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作; ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁; ReentrantLock 只适用于代码块锁,而 synchronized 可以修饰类、方法、变量等。 二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的park 方法加锁,synchronized 操作的应该是对象头中 mark word image

lukaliou123 commented 2 years ago

4.CMS垃圾回收过程

初始标记-》并发标记-》重新标记-》并发清除 image

5.FULL GC太多,怎么优化?

尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组,或者增大永生区或者使用CMS进行标记清除

6.线程池的线程资源如何回收

线程退出(回收)有两种方法: 1、参数allowCoreThreadTimeOut为true,等待keepAliveTime后,线程就会被回收。 2、加上executor.shutdown();马上将线程池中的空闲线程回收。该方法会使得keepAliveTime参数失效 https://blog.csdn.net/Agly_Clarlie/article/details/87976511

lukaliou123 commented 2 years ago

7.套接字,epoll

https://mp.weixin.qq.com/s?src=11&timestamp=1646807534&ver=3665&signature=0RkzJ6sDVWZMkdrDKNU0L-Jnzpww7**y6yTYpdu1rCCzZi*z6Wcpmm69KfK4EQjvhchmtHNPM8hGBvSG-vCkPN1JZEmdq*Ufmt3DKMbck37*pE7HOz1ffEVfv7qKVj6O&new=1 一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)

I/O多路复用是指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作

1.Select select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大 量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销

2.poll 它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

3.epoll epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。 poll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某 个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知。

image

1.监视的描述符数量不受限制 2.IO的效率不会随着监视fd的数量的增长而下降。epoll不同于select和poll轮询的方式,而是通过每个fd定义的回调函数来实现的,只有就绪的fd才会执行回调函数。 3.epoll只需要第一次注册一次,后面的监听无需每次传递fds,epoll是通过内核与用户空间mmap同一块内存,避免了无畏的内存拷贝。

lukaliou123 commented 2 years ago

8.IP ICMP UDP TCP

iCMP 的全称是 Intent Control Message Protocol, 中文过来就是 互联网控制报文协议。它是互联网协议族的核心协议之一。它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。 在IP通信中,经常有数据包到达不了对方的情况。原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了。或者,虽然到达了对方,但是由于搞错了端口号,服务器软件可能不能接受它。这时,在错误发生的现场,为了联络而飞过来的信鸽就是ICMP 报文。在IP 网络上,由于数据包被丢弃等原因,为了控制将必要的信息传递给发信方。ICMP 协议是为了辅助IP 协议,交换各种各样的控制信息而被制造出来的

ICMP的主要功能: 1.确认IP包是否成功送达目标地址。 2.通知在发送过程当中IP包被废弃的具体原因。