【打卡day03】每天学习10道java面试题

本文涵盖了Java Spring框架中Bean的生命周期,包括实例化、属性赋值、初始化和销毁四个阶段。同时深入讨论了MySQL的日志类型,如错误日志、慢查询日志、二进制日志和InnoDB存储引擎的日志。此外,还解释了MySQL主从复制的工作原理,涉及binlog和中继日志的角色。最后,文章简要概述了线程池、JVM运行时数据区、垃圾收集算法以及操作系统中断的概念。
摘要由CSDN通过智能技术生成

目录

1.Bean的生命周期?

2.Mysql日志文件有哪些?

3.Mysql主从复制原理?

4.线程池?

5.jvm运行时数据区?

6.jvm垃圾标记/清除算法?

7.浏览器输入url到出现页面的过程?

8.操作系统的中断?

9.Spring中用到的设计模式?

10.进程与进程之间、线程与线程之间的通信方式?


1.Bean的生命周期?

【生命周期】概括的说就是四个阶段:1.实例化 2.属性赋值 3.初始化 4.销毁

  1. 实例化:实例化一个 bean 对象;

  2. 属性赋值:为bean设置相关的属性;

  3. 初始化:其中在初始化前有前置处理,初始化后有后置处理;

  4. 销毁:调用bean的销毁方法;

图片来自于如何记忆 Spring 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虚拟机栈,本地方法栈属于线程私有的。

图片和内容参考来自:JVM运行时数据区如何划分?_Shockang的博客-CSDN博客_jvm运行时数据区的划分

6.jvm垃圾标记/清除算法?

【标记算法】

  1. 引用计数法:给每个对象资源维护一个计数器,用来记录有多少资源指向它。

  2. 根可达法:从GC Root集合出发,探索到的对象就是存活对象,反之是垃圾对象。

可做GC Root的对象主要有四种:

  • 虚拟机栈(栈帧中的本地变量表)中引⽤的对象

  • ⽅法区中类静态属性引⽤的对象

  • ⽅法区中常量引⽤的对象

  • 本地⽅法栈中JNI引⽤的对象

【清除算法】

  1. 标记清除算法:

    优点:算法相对简单,存活对象比较多的情况下效率较高;

    缺点:两遍扫描,效率偏低(第一遍是标记,第二遍是清除),容易产生碎片

  2. 拷贝算法

    优点:适用于存活对象较少的情况,只扫描一次(就是把有用的拷贝到另一边),效率提高,没有碎片

    缺点:空间浪费,因为要把垃圾拷贝移动;移动复制对象,还要调整对象的引用

  3. 压缩算法

    优点:不会产生碎片,方便对象分配,不会产生内存减半

    缺点:扫描两次(第一次标记,第二次压缩,这个压缩就是移动到角落去),需要移动对象,效率偏低

7.浏览器输入url到出现页面的过程?

  1. 域名解析:将域名解析成ip地址,具体过程先查找浏览器缓存、操作系统缓存(比如hosts文件)、路由缓存(路由器中的DNS缓存)、本地域名服务器。

  2. TCP连接:TCP三次握手。

  3. 发送HTTP请求:HTTP请求报文包括请求行(包括请求方法、url、协议版本)、请求头(请求附加信息)、请求体(包含请求参数数据)。

  4. 服务器处理请求并返回HTTP响应报文:响应报文由响应行(协议版本,状态码,状态码描述)、响应头部(响应附加信息)、响应主体(响应数据)三个部分组成。

  5. 浏览器解析渲染页面:根据HTML解析出DOM树,根据CSS解析出CSS规则树、结合DOM树和CSS树生成渲染树、根据渲染树计算每个节点信息、根据计算好的信息绘制页面。

  6. 断开连接:TCP四次挥手。

内容参考链接:【网络】浏览器输入URL到页面显示经历的过程_Elephant_King的博客-CSDN博客_url输入到浏览器到页面的呈现经历了什么

8.操作系统的中断?

  • 中断是指程序执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程

  • 操作系统是“中断驱动”的;换言之,中断(广义)是激活操作系统的唯一方式

  • 狭义的中断来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如I/O中断、时钟中断、外部信号中断等

  • 异常(来源于CPU内部的中断事件,和狭义共同构成广义的中断)指当前运行指令引起的中断事件,如地址异常、算术异常、处理器硬件故障等

  • 系统异常与硬件无关,系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等

内容图片参考链接:操作系统中的中断(详细介绍+图片理解)_Ding_0110M的博客-CSDN博客_操作系统的中断

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种)】

  1. 管道( pipe ):分为有名管道和匿名管道,有名管道是以文件形式存在,通过open等命令打开,通过mkfifo进行创建;匿名管道通常是以 | 的形式出现,通过 | 连接的两条指令,前一条指令的输出作为后一条指令的输入。

  2. 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  3. 共享内存(shared memory )+信号量(semophore ) :多用于传输一些大文件,如果采用管道或者消息队列传输大文件,涉及到重复拷贝,比较消耗性能,因此模拟多线程,在内存中开辟一块特殊的内存用于多个进程共享访问。也是进程间最高效的通信方式。信号量可以看作一种数据操作锁,通过对临界资源的控制访问以管理进程之间的通信,PV原语操作。

  4. 信号 (sinal ) : 用于通知接收进程某个事件已经发生,比如系统中断信号等。

  5. 套接字(socket ) : 用于多个进程之间的网络传输。可以是单机多进程也可以是不同机器上的多进程通信。打开的socket在linux下也是以文件描述符fd存在。服务端创建套接字,绑定ip端口,监听端口号,等待客户端调用,客户端创建之后与服务端TCP三次握手建立连接完成,双方就可以发送和接收数据。

【线程与线程之间】

  1. 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量。

  2. 信号机制(Signal):类似进程间的信号处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值