Bean的生命周期:
在什么情况下选择用ArrayList or LinkedList
要在List后面添加删除元素和随机访问元素,则选择ArrayList更好,如果要在List前面或中间添加删除元素或者按顺序访问元素,则选择LinkedList更好
如何判断一个对象是否存活(如何对GC对象存活的判断方式)
引用计数算法:为每一个对象创建一个引用计数器,每当一个地方引用改对象,计数器加一,当对象引用失效时,计数器减一,当计数器为0的对象,那么该对象是不能引用的,这个算法的缺点是对象相互循环引用,计数器永远不为0 可达性分析算法:一个GC Roots对象为起点,从这些节点向下搜索,这个路径被称为引用链,当对象没有被引用链相连时,该对象是不可取的 java对象通过可达性分析算法并不是马上死亡,还有一个过程看有没有必要调用finalize()方法,当这个方法已经被虚拟机调用过,或者这个对象没有重写finalize()方法,则证明这个对象已经死亡了 如果这个对象有必要执行finalize()方法,那么这个对象就会放在一个F Queue队列中,会去执行它,这里的执行不是等它调用完毕,而是触碰它,原因是万一在finalize()方法中出现死循环,或者执行缓慢,有可能导致这个F Queue队列永远被等待,甚至内存直接崩溃 回收对象有无用的类(①.这个类的实现对象已被回收,②.这个类的Class对象不能反射调用获取其方法属性,③.这个类ClassLoader对象已被回收)、废弃的字符串
HashMap的原理
HashMap的底层是数组+链表/红黑树,默认容量为16,加载因子为0.75,键值对完全可以把value看做key的附属,进行push时,会对这个key进行Hashcode()决定存储位置,如果另一个键值对的key发生hash碰撞时,这时在存储位置构建一个链表,jdk7采用头插法,jdk8采用尾插法,在jdk8中,当链表的节点个数达到8时,会转成红黑树结构,当红黑树节点降为6时,会重新变成链表,当数组的元素达到16的0.75倍时,扩大到原来的2倍,会对key进行reHash()存储。
TCP,HTTP
三次握手,四次挥手
三次握手
客户端发送带有SYN标志的数据包到服务端 服务端发送带有SYN/ACK标志的数据包到客户端 客户端发送带有ACK标志的数据包到服务端
四次挥手
客户端发送一个FIN,用来关闭客户端到服务端的数据传输 服务端收到这个FIN,发回一个ACK,确认序号为收到的序号加一,和SYN一样,一个FIN占用一个序号 服务端关闭与客户端的连接,发送一个FIN到客户端 客户端收到ACK报文确认,并把确认序号设置为收到序号加一
TCP UDP
TCP
面向连接的,能正确处理丢包,保证数据有序,有一个致命缺点连接和关闭时,要发送7个请求造成资源浪费
UDP
面向非连接的,只管发送,不管收没收到
状态码
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器错误
输入url到网页到底发生了什么
HTTP请求格式
线程池内部工作原理
线程创建
线程池执行流程
任务被提交到线程池,会先判断当前线程数量是否小于corePoolSize,如果小于则创建线程来执行提交的任务,否则将任务放入workQueue队列,如果workQueue满了, 则判断当前线程数量是否小于maximumPoolSize,如果小于则创建线程执行任务,否则就调用handler,以表示线程池拒绝接收任务
Java锁
公平锁和非公平锁
可重入锁(Reentrant Lock )
又称递归锁,是指在同一个线程在完成方法获取锁的时候,在进入内层方法会自动获取锁
synchronized就是一种可重入锁
共享锁和独享锁
互斥锁和读写锁
独享锁和共享锁就是一种广义的说法,互斥锁和读写锁是具体的实现
乐观锁和悲观锁
看到并发同步的角度
自旋锁
在java中,自旋锁是指测试获取锁的线程不会立即阻塞,而是采用循环的方式 去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU
偏向锁、轻量级锁和重量级锁
指锁的状态
MySQL建索引有哪些原则
,表示字段不重复的比例
选择索引的目的是为了使查询的速度变快
MySQL面试题
MySQL中myisam与innoDB的区别
myisam:
InnoDB:
MySQL int和char隐式类型转换需要注意什么
case1:
case2:
MySQL如何高效率随机获取N条数据
假设表叫做mm_account。
ID连续的情况下(注意不能带where,否则结果不好):
ID不连续的情况下:
如果有一个字段叫id,最快的方法如下(随机获取5条):
如果带where语句,上面就不适合了,带where语句请看下面:
MySQL索引类型及应用
普通索引:没有任何限制条件的索引,该索引可以在任何数据类型中创建
唯一索引:使用unique参数可以设置唯一索引。创建该索引时,索引项的值必须唯一,但允许有空值。通过唯一索引,用户可以快速地定位某条记录,主键索引是一种特殊的唯一索引
全文索引:仅可用于MyISAM表,针对较大的数据,生成全文索引,耗时耗空间
空间索引:只能建立在空间数据类型上。这样可以提高系统获取空间数据类型的效率。仅可用于MyISAM表,索引的字段不能为空值。使用SPATIAL参数可以设置索引为空间索引
单列索引:只对应一个字段的索引
多列索引:在表的多个字段上创建一个使用。该索引指向创建时对应的多个字段,用户可以通过这几个字段进行查询,想使用该索引,用户必须使用这些字段中的一个字段
MySQL优点
索引
数据库是收集表的集合,数据表是数据行和数据列的集合
提高查询速度的技术有很多,其中最重要的就是索引
索引的使用是影响查询速度的重要因素
操作索引
创建索引
查看索引
删除索引
索引的使用原则
查询优化建议
使用explain分析查询语句
select_type
type
type表示MySQL在表中找到所需行的方式,又称“访问类型”,常用的类型有:
ALL, index, range, ref, eq_ref, const, system, NULL。
从左到右,性能从差到好。
Key
key列显示MySQL实际决定使用的键(索引),如果没有选择索引,键是NULL。
possible_keys
possible_keys指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上如果存在索引则该索引将被列出,但不一定被查询使用。
ref
ref表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
rows
rows表示MySQL根据表统计信息,以及索引选用的情况,找到所需记录需要读取的行数。这个行数是估算的值,实际行数可能不同。
声明not null
考虑使用数值类型代替字符串
考虑使用enum类型
索引是一个单独的,存储在磁盘上的数据结构,索引对数据表中的一列或者多列值进行排序,索引包含着对数据表中所有数据的引用指针
MySQL索引
存储引擎的比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SQLam1AC-95)(e:/typora/index.png)]
在MySQL中,主要有四种类型的索引
B-树、B+树概念
B树
即二叉搜索树
特点:
B-树
是一种多路搜索树(并不是二叉的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WygzEvX2-99)(E:/typora/B-Tree.png)]
特点:
B+树
B+树是B-树的变体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrrtQ7ga-01)(E:/typora/B+Tree.png)]
特点:
建索引的几大原则
点击跳转到MySQL建索引的几大原则
线程池的好处
线程池的重用
线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,既然减少了这么多浪费内存的开销,其线程执行速度也是突飞猛进的提升
控制线程池的并发数
并发:在某个时间段内,多个程序都处在执行和执行完毕之间,但在一个时间点上只有一个抽象在运行
并行:在某个时间段里,每个程序按照自己独立异步的速度执行,程序之间互不干扰
控制线程池的并发数可以有效的避免大量的线程池争夺CPU资源而造成阻塞
详解
ThreadPoolExecutor
后面两个参数基本不用
其它线程池
线程池的单例
单例模式
单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象方式,可以直接访问,不需要实例化该类的对象
注意:
线程池的单例
首先在ThreadPool类里面实现线程池的创建
然后对ThreadPool内部类,在类里面对它实例化,实现单例
Redis的过期删除策略
常见的三删除策略
其中定时删除和定期删除为主动删除策略,惰性删除为被动删除策略
定时删除策略
定时删除策略通过使用定时器,定时删除策略可以保证过期键尽可能快的被删除,并释放过期键所占的内存
惰性删除策略
惰性删除策略只会在获取键时才对键进行过期检查,不会在删除其它无关的过期键花费过多的CPU时间
定期删除策略
定期删除策略每隔一段时间执行一次删除过期操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效减少了因为过期键带来的内存浪费
Redis使用的过期键删除策略
Redis服务器使用的是惰性删除策略和定期删除的实现
惰性删除策略的实现
过期键的惰性删除策略由expirelfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expirelfNeeded函数对输入键进行检查:
定期删除策略的实现
过期键的定期删除处理由activeExpireCycle函数实现,每当Redis服务器的周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在锁定的时间里,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键
activeExpireCycle函数的执行流程:
函数每次运行时,都从一定数量的数据库中随机取出一定数量的键进行检查,并删除其中的键,比如先从0号数据库开始检查,下次函数运行时,可能就是从1号数据库开始检查,直到15号数据库检查完毕,又重新从0号数据库开始检查,这样可以保证每个数据库都被检查到
SQL优化
基本概念
逻辑架构
锁
数据库通过锁机制来解决并发场景-共享锁(读锁)和排他锁(写锁)。读锁是不会阻塞的,多个客户端可以在同一时刻读取同一资源。写锁是排他的,并且会阻塞其他的读锁和写锁
要锁定数据需要一定的锁处理来配合
但是MySQL的存储引擎的真实实现不是简单的行级锁,一般都是实现了多版本并发控制(MVCC),MVCC是行级锁的变种,开销更低。MVCC是通过保存数据的某个时间点快照实现的
事务
事务保证一组原子性的操作,要么全部成功,要么全部失败,一旦失败,回滚之前的所有操作。
MySQL采用自动提交,如果不是显示的开启一个事务,则某个查询都作为一个事务
隔离级别控制了一个事务值的修改,哪些事务内和事务间是可见的
四种常见的隔离级别:
存储引擎
InnoDB引擎,最重要,使用最广泛的存储引擎,被用来设计处理大量短期事务,具有高性能和自动崩溃恢复的特性
MyISAM引擎,不支持事务和行级锁,崩溃后无法安全恢复
创建时优化
Shema和数据类型优化
索引
索引包含一个或多个列的值。MySQL只能高效的利用索引的最左前缀列
优势:
B-Tree索引
使用最多的索引类型。采用B-Tree数据结构来数据结构(每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子结点的遍历)。B-Tree索引适用于全键值,键值范围,键前缀查找,支持排序
B-Tree索引限制:
哈希索引:
只有精确匹配索引的所有类,查询才有效。存储引擎对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,并保存指向每个数据行的指针
限制:
优化建议点:
查询时优化
查询质量的三个重要指标
查询优化点
补充内容
Spring用了哪些设计模式?
策略模式
本质上讲,策略模式就是一个接口下有多个实现类,而每一种实现类会处理某一种情况
注意:
工厂方法模式
所谓的工厂方法模式,就是定义一个工厂方法,通过传入的参数,返回某个实例,然后通过该实例来处理后续的业务逻辑。一般的,工厂方法的返回值类型是一个接口类型,而选择具体子类实例的逻辑则封装到了工厂方法中了。通过这种方式,来将外层调用逻辑与具体的子类的获取逻辑进行分离

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/189212.html