1.JVM包含哪几部分
- 类加载器
- 运行时数据区(堆、栈、方法区、本地方法栈和程序计数器)
- 方法区:静态变量、常量、类信息和运行时常量池
- 程序计数器:每个线程都有一个程序计数器,就像一个指针,指向方法去中的方法字节码(比如每次读下一条指令的时候给它+1)
- 本地方法栈:登记native方法,在执行引擎的时候加载本地库
- 栈:生命周期和线程同步;不存在垃圾回收问题;存放八大基本类型、对象引用变量名、实例的方法
- 堆:类的实例、字符串常量池
- 新生区:伊甸园区、幸存0区、幸存1区
- 养老区
- 永久区(方法区的具体实现,jdk1.8后改为叫元空间,一部分人认为他不应该划分在堆内,一部分人认为应该划分在堆内)
- 执行引擎
- 本地库接口
2.双亲委派机制
- 类加载器收到类加载的请求
- 将这个请求委托给父类加载器去完成,一直向上委托,直到启动类加载器
- 启动类加载器能执行就结束,否则抛出异常,依次向下通知子类进行加载
- 优点:
- 从最内层开始加载,外层恶意同名类得不到加载从而无法使用
- 严格通过包来区分了访问域,外层恶意的类通过内置代码也无法访问到内层类
3.创建对象内存分析
(案例取自遇见狂神说的java课程视频)
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案【点击此处即可/免费获取】
https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho
4.JAVA对象实例化过程
- 类的加载初始化
- 加载:载入class对象,不一定是从class文件获取,可以是jar包,或者动态生成的class
- 连接
- 验证:校验class字节流是否符合当前jvm规范
- 准备:为 类变量 分配内存并设置变量的初始值( 默认值 )。如果是final修饰的对象则是赋值声明值
- 解析:将常量池的符号引用替换为直接引用
- 初始化
- 使用
- 卸载
- 对象的初始化
5.GC时候哪些需要回收
- 引用计数算法
- 可达性分析算法
6.三种基本的GC算法
- 标记-清除算法
内存中的对象构成一棵树,当有效的内存被耗尽的时候,程序就会停止,做两件事,第一:标记,标记从树根可达的对象,第二:清除不可达的对象。标记清除的时候程序会停止运行
缺点:递归效率低性能低;释放空间不连续容易导致内存碎片;会停止整个程序运行; - 复制算法
把内存分成两块区域:空闲区域和活动区域,第一还是标记,标记之后把可达的对象复制到空闲区,将空闲区变成活动区,同时把以前活动区对象清除,变成空闲区。
缺点:速度快但耗费空间 - 标记-整理算法
在标记清除算法之后不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。 - 分代收集算法,即新生代、老年代、永久代
- 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
- 内存整齐度:复制算法=标记压缩算法>标记清除算法
- 内存利用率:复制算法<标记清除算法=标记压缩算法
7.jdk、jre和jvm
- jdk:java开发工具包。包括java运行环境(jre),java工具,java基础的类库
- jre:java运行环境。包括jvm标准实现及java核心类库
- jvm:java虚拟机,一种抽象化的计算机
三、mysql
1.数据库三大范式
- 第一范式:强调的是列的原子性,即列不能够再分成其他几列。
- 第二范式:在第一范式基础上,必须有一个主键其他字段必须完全依赖于主键,而不能只依赖于主键的一部分。
- 第三范式:在前两个范式基础上,非主键列必须直接依赖于主键,不能存在传递依赖。
2.防止sql注入
- 代码层防止sql注入攻击的最佳方案就是sql预编译(prepareedstatement类)
- 规定数据长度,能在一定程度上防止sql注入
- 严格限制数据库权限,能最大程度减少sql注入的危害
3.索引
- 索引是帮助MySQL高效获取数据的数据结构,通俗来讲索引就好比书本的目录,加快数据库的查询速度。
- 分类
- 按功能逻辑分
- 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
- 唯一索引:加速查询 + 列值唯一(可以有null)
- 普通索引:仅加速查询
- 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
- 全文索引:对文本的内容进行分词,进行搜索
- 按物理结构分
- 聚簇索引
- 非聚簇索引
- 按功能逻辑分
4.ACID
- 原子性:要么都发生,要么都不发生。
- 一致性:事务前后数据的完整性必须保持一致。
- 隔离性:一个事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性:一个事务一旦被提交,数据不可再恢复
5.事务并发产生的三种问题
- 脏读:一个事务读取到了另外一个事务没有提交的数据
- 幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同(数据条数)
- 不可重复读:在同一事务中,两次读取同一数据,得到内容不同(数据内容)
6.mysql的事务隔离级别
- 读未提交 Read uncommitted:一个事务还没有提交时,它做的变更就能被别的事务看到。
- 读提交 Read committed:一个事物提交之后,它做的变更才会被其他事务看到。
- 可重复读 Repeatable read:一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的。
- 串行化 serializable:对于同一行记录,写会加“写锁”,读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行。
7.数据库锁
- 按粒度分:
- 行锁
- 页锁
- 表锁
- 全局锁
- 按锁的级别
- 共享(读)锁(S)
- 排他(写)锁(X)
- 意向共享锁
- 意向排他锁
8.Mysql事务的分类
- 扁平式事务
- 带有保存点的扁平式事务
- 链事务
- 嵌套事务
- 分布式事务
9.联表查询
10.innodb和myisam区别
- innodb支持事务;myisam不支持事务
- innodb支持外键;myisam不支持外键
- innodb是聚集索引,数据和索引是捆绑在一起的;myisam是非聚集索引,数据和索引分开的,这也导致他们底层B+树结构不同。
- innodb每个表下两个文件:.frm文件中保存的是表的结构,.ibd文件中保存的是数据和索引方式
- myisam每个表下三个文件:一个文件用来保存 表结构,一个文件用来保存 数据,一个文件用来保存 索引
11.mysql调优
- mysql调优
- 基于硬件级别的调优:跟硬件有关系的一般是由运维工程师进行调优。
- 基于MySQL本身的SQL语句的调优:让SQL语句尽量走“索引”提高效应
- 表设计优化,遵循三大范式
- 设立索引
- 查询方面他,尽量走索引,不要select *
- 索引失效的情况
- like查询已%开头
- 复合索引不满足最左匹配
- or关键字前后都得是索引列
- where中索引列使用了函数
- 索引失效的情况
- 数据量过大时候进行分库分表:水平分表、垂直分表
四、计算机网络
1.OSI七层模型
- (物)物理层:为数据端设备提供原始比特流的传输的通路
- (联)数据链路层:在通信的实体间建立数据链路连接
- (网)网络层:为数据在节点之间传输创建逻辑链路,并分组转发数据(IP、IPX)
- (淑)传输层:提供应用进程之间的逻辑通信(TCP、UDP)
- (惠)会话层:建立端连接并提供访问验证和会话管理
- (试)表示层:提供数据格式转换服务
- (用)应用层:访问网络服务的接口(DNS、HTTP、FTP)
2.三次握手
- A将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给B,A进入SYN_SENT状态,等待B确认。
- B收到数据包后由标志位SYN=1知道A请求建立连接,B将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给A以确认连接请求,B进入SYN_RCVD状态。
- A收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给B,B检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,A和B进入ESTABLISHED状态,完成三次握手
3.四次挥手
- 第一次挥手:A发送一个FIN,用来关闭A到B的数据传送,A进入FIN_WAIT_1状态。
- 第二次挥手:B收到FIN后,发送一个ACK给A,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),B进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收
- 第三次挥手:B发送一个FIN,用来关闭B到A的数据传送,B进入LAST_ACK状态。
- 第四次挥手:A收到B后,A进入TIME_WAIT状态,接着发送一个ACK给B,确认序号为收到序号+1,B进入CLOSED状态,完成四次挥手。
4.http和Htpps的区别
- https协议需要申请证书
- http是超文本传输协议,信息是明文的;https是经过SSL加密后传输的
- 端口不一样,http是80;https是443
- http连接简单,无状态;https是SSL+http可加密和身份确认,更加安全
5.Tcp和Udp的区别
- tcp是面向连接的;udp是无连接的
- tcp是可靠传输,无丢失,无差错;udp是不可靠传输,最大努力交付
- tcp只能一对一;udp支持一对一,一对多
- tcp是面向字节流,udp是面向报文
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案【点击此处即可/免费获取】
https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho
6.输入url到显示页面全过程
- 输入url
- 缓存中查找是否存在域名,存在就直接取出ip地址,没有就进行DNS解析获取协议名、主机号、端口号
- tcp三次握手使客户端服务端建立连接
- 客户端发送http请求,请求获取资源
- 服务器http响应报文,客户端获取到资源
- tcp四次挥手关闭连接
- 浏览器解析资源渲染界面
7.DNS的过程
- 用户机提出域名解析请求,并且发送给本地的域名服务器
- 如果本地缓存中有,就直接返回
- 如果没有,本地域名服务器就直接把请求发给根域名服务器,根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址
- 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址;
- 重复第四步骤,直到找到正确的纪录,本地域名服务器把返回的结果保存到缓存,再把查询的结果返回;
8.进程和线程
- 进程:操作系统资源分配的最小单位
- 线程:操作系统运算调度的最小单位
- 区别:
- 从属关系不同:进程中包含了线程,线程属于进程。
- 开销不同:进程的创建、销毁和切换的开销都远大于线程。
- 拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。
- 控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。
- CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。
- 操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。
五、java框架
(1)springboot
1.springboot优于spring的地方
- 内嵌 Tomcat , Jetty Undertow 而且不需要部署他们
- 提供的“starters” poms来简化 Maven 配置
- 起步依赖,创建项目时候就可以勾选所需的依赖
- 全部采用注解方式,没有繁琐的xml配置
(2)spring
1.IOC
- 控制反转,是一种设计思想。将原本在程序中手动创建对象的控制权,交由Spring框架的容器来管理,并且需要一种描述让容器知道要创建的对象间的关系。即IOC容器来管理对象及其依赖关系。
2.依赖注入的实现方法
依赖注入(DI)是实现IOC的一种方法
- 构造器注入
- set方法注入
- 其他方式(接口注入、注解注入)
注意:spring 4.0开始就不推荐使用属性注入(即@Autowride底下出现波浪线)
原因:1.不允许声明不可变域。基于字段的依赖注入在声明为final/immutable的字段上不起作用,因为这些字段必须在类实例化时实例化。声明不可变依赖项的惟一方法是使用基于构造器的依赖注入。2.与依赖注入容器紧密耦合。这样的类不能在DI容器之外重用,因为除了反射之外,没有其他方法为它提供所需的依赖项。3.违反单一责任原则。添加新的依赖项非常容易。当添加过多时候,不容易发现,而用构造函数的话,构造函数参数会变过多,可以明显发现问题。依赖太多通常意味着类有太多的责任。这可能违反了单一职责原则。4.隐藏依赖。不能有效的指明依赖
3.AOP
- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。基于动态代理,oop(面向对象编程),反射
4.AOP的术语
- 切面:切面泛指交叉业务逻辑。比如声明式事物处理,日志处理就可以理解为切面
- 通知:就是你想要的功能,即切面中的方法
- 连接点:可以使用通知的地方。如每个方法的前后
- 切入点:切面实际切入的地方
- 目标:要被通知的对象
5.AOP的实现方式
- 使用原生的Spring API接口(实现前置通知、后置通知、环绕通知等接口)
- 自定义类
- 注解实现(@Aspect)
6.IOC容器
- BeanFactory:提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
- ApplacationContext:继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能
- 国际化
- 访问资源,如URL和文件
- 事件传递:通过实现ApplicationContextAware接口
7.创建ApplacationContext的方法
- FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组
- ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
- WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
8.bean的作用域
- singleton:在Spring容器中仅存在一个实例,即Bean以单例的形式存在。
- prototype:为每一个bean请求提供一个实例。
- request :每次HTTP请求都会创建一个新的Bean。
- session:同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。
- globalSession:同一个全局的Session共享一个Bean,一般用于Portlet环境。
9.bean的生命周期
- 实例化(通过构造方法或者工厂方法)
- 属性赋值 (依赖注入)
- 初始化
- 销毁
10.bean的自动装配
- @Autowried:通过byType方式实现,并且要求这个对象存在
- @Resouce:默认通过byName方式实现,如果name找不到再通过byType实现
(3)SpringMVC
1.SpringMVC概念
- MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。
2.Spring MVC的执行流程
参考博客
用户发送请求到前端控制器DispatcherServlet
DispatcherServlet收到请求调用处理映射器HandlerMapping
处理映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包含处理器对象和处理器拦截器)返回给DispatcherServlet
DispatcherServlet根据处理器Handler获取对应的适配器
HandlerAdapter调用处理器Handler
Handler(Controller)执行完成后返回ModelAndView
HandlerAdapter返回ModelAndView
DispatcherServlet统一将返回的ModelAndView派送到ViewResolve(视图解析器)解析
视图解析器解析之后返回View
对View进行渲染
响应用户
3.拦截器和过滤器的区别
- 实现原理不一样:拦截器实现原理是反射机制,过滤器是函数回调
- 使用范围不一样:过滤器是servelet中定义的,依赖于tomcat等容器,只能在web程序中使用;拦截器是spring的一个组件,可以单独使用,还可用在web程序跟其他程序
六、Redis
1.持久化RDB和AOF的区别
- RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
- 优点:
- 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
- 相比于AOF机制,如果数据集很大,RDB的启动效率会更高
- 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上
- 缺点:
- 系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失
- 优点:
- AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
- 优点:
- 可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。
- 即使出现宕机现象,也不会破坏日志文件中已经存在的内容。如果我们本次操作只写入了一半数据就出现了系统崩溃问题,在Redis下一次启动之前,通过redis-check-aof工具来解决数据一致性的问题。
- 缺点:
- 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
- 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案【点击此处即可/免费获取】
https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho
- 优点:
2.redis的数据类型
- 五大数据类型:String、List、Set、Hash、Zset(增加分数字段用来排序)
- 三种特殊数据类型:Geospatial(地理位置)、Hyperloglog(基数统计,应用于网站访问量)、BitMaps(位图,应用于签到、状态统计)
3.redis高可用
- 哨兵和集群模式
4.缓存穿透、缓存击穿、缓存雪崩
- 缓存穿透:客户端查询根本不存在的数据,使得请求直达存储层,导致其负载过大,甚至宕机。出现这种情况的原因,可能是业务层误将缓存和库中的数据删除了,也可能是有人恶意攻击,专门访问库中不存在的数据。
- 解决方案:缓存空对象;布隆过滤器
- 缓存击穿:一份热点数据,它的访问量非常大。在其缓存失效的瞬间,大量请求直达存储层,导致服务崩溃。
- 解决方案:热点数据永不过期;加互斥锁
- 缓存雪崩
- 解决方案:设置过期时间时,附加一个随机数,避免数据同时过期;
七、Linux常用命令
1.目录切换
- cd /:切换到根目录
- cd …/:切换到上级目录
- cd ~:切换到home目录
2.目录查看
- ls:查看当前目录下的所有目录和文件
- ls -a:查看当前目录下的所有目录和文件(包含隐藏文件)
- ls -l:列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
3.目录操作
- 创建
- mkdir 目录名
- 删除
rm -f: 强行删除,不询问
rm -r 目录名:递归删除目录 - 修改
- mv 当前目录 新目录
- 查找
- find 目录 参数 文件名称
- 示例:find /usr/tem -name ‘a*’ 查找/usr/tmp目录下的所有以a开头的目录或文件
4.文件操作
- 创建
- touch 文件名
- 删除
- rm -rf
- 修改
- vi或者vim,分为三种模式
- 命令行模式
- 编辑模式
- 底行模式
- vi或者vim,分为三种模式
- 查看
- cat:看最后一屏
- more:百分比显示
- less:翻页显示
- tail:指定行数或者动态查看
5.权限操作
chmod (u g o a) (+ - =) (r w x) (文件名)
- u:文件的拥有者
- g:与拥有者在同一组
- o:其他用户
- a:上面三者皆是
- +:增加权限
- -:撤销权限
- =:设定权限
- r:读权限
- w:写权限
- x:可执行(没有即代表不可cd进入这个目录)
6.打包和压缩
- 打包文件:tar -cvf 打包文件.tar 被打包的文件/路径…
- 解包文件:tar -xvf 打包文件.tar
- 参数说明
- c:生成档案文件,创建打包文件
- x:解开档案文件
- v:显示过程
- f:指定档案文件名称
- 压缩文件:tar -zcvf 打包文件.tar.gz 被压缩的文件/路径…
- 解压文件:tar -zxvf 打包文件.tar.gz
7.查找指令
- grep:字符串匹配(从一个文件的内容中匹配一个字符串)
- 样例:ps -ef | grep sshd -c 查找指定进程ssh个数
- -c:只输出匹配行的计数。
- -i:不区分大小写。
- -h:查询多文件时不显示文件名。
- -l:查询多文件时只输出包含匹配字符的文件名。
- -n:显示匹配行及 行号。
- -s:不显示不存在或无匹配文本的错误信息。
- -v:显示不包含匹配文本的所有行。
- find:从指定的目录下查找文件或目录。
- 用法:find 路径 参数 文件名
- 样例:find /home/ygt -name test.txt查找自己账户下文件名为test.txt的文件
- 以文件名查找:find 目录 -name “文件名或者目录名”
- 以文件类型查找:find 目录 -type d(目录型文件)/f(普通文件)
- 以文件大小查找:find 目录 -size +nk(超过nk)/-n(小于nk)
- 按分钟查找:find 目录 -amin/-bmin/-mmin +n(n分钟之外)/-n(n分钟之内)
- 按天查找:find 目录 -atime/-ctime/-mtime +n(n天之外)/-n(n天之内)
- locate:更快速的定位文件。(默认每天自动更新一次,若要查询最近更改的文件得先updatedb 来更新检索数据库)
- 样例:locate /etc/sh 搜索etc目录下所有以sh开头的文件
- locate pwd 查找和pwd相关的所有文件
8.用户切换
- su
- sudo(为所有想使用root权限的普通用户设计的)
9.查看当前目录
- pwd
10.查看进程
- ps -ef
11.结束进程
- kill
八、分布式
1.CAP原则
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
- 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
- 分区容忍性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。