目录
1.Bean的生命周期?
【生命周期】概括的说就是四个阶段:1.实例化 2.属性赋值 3.初始化 4.销毁
-
实例化:实例化一个 bean 对象;
-
属性赋值:为bean设置相关的属性;
-
初始化:其中在初始化前有前置处理,初始化后有后置处理;
-
销毁:调用bean的销毁方法;
2.Mysql日志文件有哪些?
错误日志(error log)、慢查询日志(slow query log)、一般查询日志(general log)、二进制日志(bin log)
还有两个InnoDB存储引擎特有的两个日志:重做日志(redo log)、回滚日志(undo log);
错误⽇志⽂件:对MySQL的启动、运⾏、关闭过程进⾏了记录,能帮助定位MySQL问题。
慢查询⽇志 :慢查询⽇志是⽤来记录执⾏时间超过 long_query_time 这个变量定义的时长的查询语句。通过慢查询⽇志,可以查找出哪些查询语句的执⾏效率很低,以便进⾏优化。
⼀般查询⽇志 :⼀般查询⽇志记录了所有对MySQL数据库请求的信息,⽆论请求是否正确执⾏。
⼆进制⽇志 :关于⼆进制⽇志,它记录了数据库所有执⾏的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在⼆进制⽂件中。
重做⽇志 :重做⽇志⾄关重要,因为它们记录了对于InnoDB存储引擎的事务⽇志。
回滚⽇志 :回滚⽇志同样也是InnoDB引擎提供的⽇志,顾名思义,回滚⽇志的作⽤就是对数据进⾏回滚。当事务对数据库进⾏修改,InnoDB引擎不仅会记录redo log,还会⽣成对应的undo log⽇志;如果事务执⾏失败或调⽤了rollback,导致事务需要回滚,就可以利⽤undo log中的信息将数据回滚到修改之前的样⼦。
3.Mysql主从复制原理?
Mysql的主从复制是主要是依靠binlog日志实现的,从数据库通过订阅主数据库的binlog日志,实现数据的拷贝。具体流程如下:
-
master数据写入,更新binlog日志
-
master会创建一个dump线程向slave推送binlog
-
slave连接到master的时候,会创建一个IO线程接收binlog,并记录到中继日志relay log中
-
slave再另开启一个sql线程读取中继日志并在slave中执行,完成同步,并记录到slave节点的bin log日志中
4.线程池?
【作用】通过线程池管理线程,可以反复利用线程资源从而可以减少线程创建与销毁的开销,提高响应速度。
【常见的线程池】
newFixedThreadPool (固定数⽬线程的线程池) newCachedThreadPool (可缓存线程的线程池) newSingleThreadExecutor (单线程的线程池) newScheduledThreadPool (定时及周期执⾏的线程池)
【线程池的参数】
corePoolSize:线程核⼼参数选择了CPU数×2 maximumPoolSize:最⼤线程数选择了和核⼼线程数相同 keepAliveTime:⾮核⼼闲置线程存活时间直接置为0 unit:⾮核⼼线程保持存活的时间选择了 TimeUnit.SECONDS 秒 workQueue:线程池等待队列,使⽤ LinkedBlockingQueue阻塞队列
5.jvm运行时数据区?
JVM运行时数据区可划分为,程序计数器(PC寄存器),Java虚拟机栈,本地方法栈,方法区和堆。
其中方法区和堆属于线程之间共享的,程序计数器(PC寄存器),Java虚拟机栈,本地方法栈属于线程私有的。
6.jvm垃圾标记/清除算法?
【标记算法】
-
引用计数法:给每个对象资源维护一个计数器,用来记录有多少资源指向它。
-
根可达法:从GC Root集合出发,探索到的对象就是存活对象,反之是垃圾对象。
可做GC Root的对象主要有四种:
-
虚拟机栈(栈帧中的本地变量表)中引⽤的对象
-
⽅法区中类静态属性引⽤的对象
-
⽅法区中常量引⽤的对象
-
本地⽅法栈中JNI引⽤的对象
【清除算法】
-
标记清除算法:
优点:算法相对简单,存活对象比较多的情况下效率较高;
缺点:两遍扫描,效率偏低(第一遍是标记,第二遍是清除),容易产生碎片
-
拷贝算法
优点:适用于存活对象较少的情况,只扫描一次(就是把有用的拷贝到另一边),效率提高,没有碎片
缺点:空间浪费,因为要把垃圾拷贝移动;移动复制对象,还要调整对象的引用
-
压缩算法
优点:不会产生碎片,方便对象分配,不会产生内存减半
缺点:扫描两次(第一次标记,第二次压缩,这个压缩就是移动到角落去),需要移动对象,效率偏低
7.浏览器输入url到出现页面的过程?
-
域名解析:将域名解析成ip地址,具体过程先查找浏览器缓存、操作系统缓存(比如hosts文件)、路由缓存(路由器中的DNS缓存)、本地域名服务器。
-
TCP连接:TCP三次握手。
-
发送HTTP请求:HTTP请求报文包括请求行(包括请求方法、url、协议版本)、请求头(请求附加信息)、请求体(包含请求参数数据)。
-
服务器处理请求并返回HTTP响应报文:响应报文由响应行(协议版本,状态码,状态码描述)、响应头部(响应附加信息)、响应主体(响应数据)三个部分组成。
-
浏览器解析渲染页面:根据HTML解析出DOM树,根据CSS解析出CSS规则树、结合DOM树和CSS树生成渲染树、根据渲染树计算每个节点信息、根据计算好的信息绘制页面。
-
断开连接:TCP四次挥手。
内容参考链接:【网络】浏览器输入URL到页面显示经历的过程_Elephant_King的博客-CSDN博客_url输入到浏览器到页面的呈现经历了什么
8.操作系统的中断?
-
中断是指程序执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程
-
操作系统是“中断驱动”的;换言之,中断(广义)是激活操作系统的唯一方式
-
狭义的中断来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如I/O中断、时钟中断、外部信号中断等
-
异常(来源于CPU内部的中断事件,和狭义共同构成广义的中断)指当前运行指令引起的中断事件,如地址异常、算术异常、处理器硬件故障等
-
系统异常与硬件无关,系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等
9.Spring中用到的设计模式?
-
⼯⼚模式 : Spring 容器本质是⼀个⼤⼯⼚,使⽤⼯⼚模式通过 BeanFactory、ApplicationContext 创建 bean对象。
-
代理模式 : Spring AOP 功能就是通过代理模式来实现的,分为动态代理和静态代理。
-
单例模式 : Spring 中的 Bean 默认都是单例的,这样有利于容器对Bean的管理。
-
模板模式 : Spring中 JdbcTemplate、RestTemplate 等以 Template结尾的对数据库、⽹络等等进⾏操作的模板类,就使⽤到了模板模式。
-
观察者模式 : Spring 事件驱动模型就是观察者模式很经典的⼀个应⽤。
-
适配器模式 :Spring AOP 的增强或通知 (Advice) 使⽤到了适配器模式、Spring MVC 中也是⽤到了适配器模式适配 Controller。
-
策略模式 :Spring中有⼀个Resource接口,它的不同实现类,会根据不同的策略去访问资源。
10.进程与进程之间、线程与线程之间的通信方式?
【进程与进程之间(主要是5种)】
-
管道( pipe ):分为有名管道和匿名管道,有名管道是以文件形式存在,通过open等命令打开,通过mkfifo进行创建;匿名管道通常是以 | 的形式出现,通过 | 连接的两条指令,前一条指令的输出作为后一条指令的输入。
-
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
-
共享内存(shared memory )+信号量(semophore ) :多用于传输一些大文件,如果采用管道或者消息队列传输大文件,涉及到重复拷贝,比较消耗性能,因此模拟多线程,在内存中开辟一块特殊的内存用于多个进程共享访问。也是进程间最高效的通信方式。信号量可以看作一种数据操作锁,通过对临界资源的控制访问以管理进程之间的通信,PV原语操作。
-
信号 (sinal ) : 用于通知接收进程某个事件已经发生,比如系统中断信号等。
-
套接字(socket ) : 用于多个进程之间的网络传输。可以是单机多进程也可以是不同机器上的多进程通信。打开的socket在linux下也是以文件描述符fd存在。服务端创建套接字,绑定ip端口,监听端口号,等待客户端调用,客户端创建之后与服务端TCP三次握手建立连接完成,双方就可以发送和接收数据。
【线程与线程之间】
-
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量。
-
信号机制(Signal):类似进程间的信号处理