面经

1.七层网络结构前端

  应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。mysql

2.TCP与UDP的区别git

  a.数据可靠与不可靠,基于链接和无链接。算法

  b.TCP会有三次握手、确认、窗口、重传、拥塞控制等。UDP无spring

  c.TCP须要创建链接,慢,占用系统资源,效率较低,且容易受到攻击。UDP快、但网络拥堵时容易丢包。sql

  d.TCP适用于保证数据安全的场景:http、ssh、pop、telnet、ftp、smtp。UDP适用的场景:语音、视频、TFTP等。数据库

  e.TCP点对点链接。UDP能够一对一,一对多,多对多。浏览器

  TCP有的一些特性:安全

    。ARQ(自动重复请求):出错时尝试简单的 从新发送。服务器

    。窗口:若是你把在一个通讯对话中发送的全部分组排成长长的一行,但只能经过一个小孔来观察他们,你就只能看到他们的一个子集——像经过一个窗口观看同样。

    。流量控制:接收方跟不上发送方的速率时,会强迫发送方慢下来。拥塞控制属于流量控制的一种形式。

3.红黑树

  红黑树:是平衡搜索树中的一种,能够保证在最坏状况下基本动态集合操做的时间复杂度为O(lgn);

  树中每一个结点包含5个属性:color、key、left、right、和p。

  性质:

    1.每一个结点或是红色的或是黑色的。

    2.根节点是黑色的。

    3.每一个叶节点是黑色的。

    4.若是一个节点是红色的,则它的两个子节点都是黑色的。

    5.对每一个节点,从该结点到其全部后代叶结点的简单路径上,均包含相同数目的黑色结点。

4.平衡二叉树

  它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,而且左右两个子树都是一棵平衡二叉树

5.HashMap原理

  待完善。

6.Spring IoC原理

  IoC(控制反转)也称为依赖注入(DI)。在传统的开发模式中,一般在一个类中使用new Object来建立其余类的对象,这样,咱们程序的耦合度会变得很高。而Spring经过容器来管理对象之间的依赖关系,通俗来说,若是对象须要依赖其余对象,那么就向Spring容器来提交本身的需求对象,Spring容器将提供给对象请求的需求对象。对象的生命周期以及相互之间的协调不禁本身掌握,而是由Spring容器来掌握,这个过程和传统相比是相反的,所以称为控制反转。

  两个包:org.springframework.beansorg.springframework.context;

  两个主要接口:BeanFactory,ApplicationContext

 

7.Redis回收策略

  • volatile-lru:从已设置过时时间的数据集中挑选最近最少使用的数据淘汰

  • volatile-ttl:从已设置过时时间的数据集中挑选将要过时的数据淘汰

  • volatile-random:从已设置过时时间的数据集中任意选择数据淘汰

  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

  • allkeys-random:从数据集中任意选择数据淘汰

  • no-enviction:禁止回收数据

8.大文件查找指定条件的行(太大,没法加载到内存,在磁盘中)

  一种不太好的方式:拆分大文件为小文件。

  另外一种大概多是加索引排序??

9.如何同步。如何解决并发。

  a.synchronized关键字

  b.锁

  c.Java集合框架中的一些类须要了解。

10.乐观锁和悲观锁

  乐观锁:每次拿数据的时候认为别人不会修改,因此不会上锁,可是在更新时会判断在此期间别人有没有更新操做的数据,可使用版本号version等机制做为更新依据。乐观锁适应于多读的状况。可使用CAS实现。

  悲观锁:老是假设最坏的状况,每次操做数据以前都会上锁,好比行锁、表锁、读写锁等。使用synchronized实现。

  使用的时机:当访问冲突几率小于20%的时候,使用乐观锁,不然使用悲观锁,且乐观锁的重试次数很多于3次。

11.GC

  四种算法:标记清理、复制、标记整理、分代收集。

  a.Serial收集器:单线程收集器,采用复制算法,STW(stop the world),在进行垃圾收集时,必须暂停其余全部的工做线程,直到它收集结束。优势:在单线程内存较小环境下,无线程交互,效率较高。

  b.ParNew收集器:Serial的多线程版本。与Serial几乎如出一辙,除了是多线程外。优势:在新生代中只有此和Serial可以配合CMS收集器工做。

  c.Parallel Scavenge收集器:并行清除收集器。使用复制算法,也是并行的多线程收集器。优势:达到一个可控制的吞吐量。参数MaxGCPauseMillis能够尽量的保证内存回收花费的时间不超过设定值。GCTimeRatio参数能设置吞吐量大小。UseAdaptiveSizePolicy:GC自动调节策略,虚拟机会根据当前系统的运行状况收集性能监控信息。动态调整参数以提供合适的停顿时间和最大的吞吐量。

  d.Serial Old收集器:Serial 收集器的老年代版本。也是单线程的。使用标记整理算法。也是Client模式下的虚拟机使用。

  e.Parallel Old收集器:Parallel Scavenge的老年代版本。使用标记整理算法。优势:在注重吞吐量和CPU资源敏感的场合能够优先考虑这两种收集器。

  f.CMS收集器:Concurrent Mark Sweep 标记清除算法实现。以获取最短回收停顿时间为目标的收集器,重视服务器的响应速度。整个过程分四步:初始标记、并发标记、从新标记、并发清除。一、 3须要STW。并发收集,低停顿。缺点:对CPU资源敏感,耗费cpu资源;没法处理浮动垃圾,在并发清理时产生的垃圾;空间碎片过多。

  g.G1收集器:1.7商用。优势:并行和并发:充分利用多cpu、多核环境来缩短STW时间。分代收集。空间整合:总体是标记整理,局部是复制。可预测的停顿:创建可预测的停顿时间模型。将整个Java堆划分为多个大小相等的独立区域(Region)。虚拟机使用Remembered Set来避免全堆扫描。四个步骤:初始标记、并发标记、最终标记、筛选回收。

12.TCP三次握手和四次挥手

  TCP头部:标准长度是20字节。

  序列号:标识了TCP发送端到TCP接收端的数据流的一个字节,该字节表明着包含该序列号的报文段的数据中的第一个字节。

  确认号:该确认号的发送方期待接收的下一个序列号

  CWR:拥塞窗口标示。发送方下降它的发送速率。

  ECE:ECN回显。发送方接收到了一个更早的拥塞控制。

  URG:紧急。紧急指针有效。

  ACK:确认。确认好字段有效。

  PSH:推送。接收方应尽快给应用程序传送这个数据。

  RST:重置链接。常常是由于错误。

  SYN:用于初始化一个链接的同步序列号。

  FIN:该报文段的发送方已经结束向对方发送数据。

创建链接步骤:

   步骤一:主动开启者(客户端)发送一个SYN报文段,并指明本身想要链接的端口号和它的客户端初始序列号(记为ISN(c))。

   步骤二:服务器发送本身的SYN报文段做为响应,并包含了它的初始序列号(记为ISN(s)),此外,为了确认客户端的SYN,服务器将包含的ISN(c)数值+1后做为返回的ACK数值。所以,每发送一个SYN,序列号就会自动+1.若是出现丢失的状况,该SYN将会重传。

  步骤三:为了确认服务器的SYN,客户端将ISN(s)的数值+1后做为返回的ACK数值。

断开链接步骤:

  步骤一:链接的主动关闭者发送一个FIN段指明接收者但愿看到本身当前的序列号K和一个ACK段用于确认对方最近一次发来的数据L。

  步骤二:链接的被动关闭者将K的数值+1做为响应的ACK值,以代表它已经成功接收到主动关闭者发送的FIN。

  步骤三:上层的应用程序会被告知链接的另外一端已经提出了关闭的请求。这将致使应用程序发起本身的关闭操做,即发送本身的FIN和序列号L。

  步骤四:为完成链接的关闭,最后发送的报文段还包含一个ACK用于确认上一个FIN。若是出现FIN丢失的状况,那么发送方将从新传输知道接收到一个ACK确认标识。

13. 公平锁非公平锁

  公平锁:若是一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,也就是FIFO。

  非公平锁:不会按照FIFO顺序来执行同步,而是使用抢占式,只要CAS置同步状成功,表示当前线取了锁。

  公平锁每每没有非公平锁效率高。但不是全部的场景都是TPS做为惟一指标。

14.Spring MVC的请求流程

  Spring MVC的全部请求都会经过一个前端控制器Servlet。名称为DispatcherServlet①。而后DispatcherServlet查询一个或者多个处理器映射(Handler Mapping)②来肯定处理请求的控制器(Controller)③,是根据请求携带的URL信息肯定的。以后控制器根据请求的数据,委托给一个或多个服务对象处理相关业务逻辑,完成后将返回的信息(称为Model)返回到用户并在浏览器中显示。大部分时候须要将Model格式化输出,好比HTML,因此控制器会将Model数据打包,而且标识出用于渲染输出的视图名,返回给DispatcherServlet④。以后DispacherServlet将使用视图解析器(View Resolver)⑤来将逻辑视图名匹配为一个特定的视图实现。多是JSP。这个特定的视图将使用模型数据渲染输出⑥,经过响应对象传递给客户端⑦。

15.进程的状态

(1)运行(running)态:进程占有处理器正在运行。
(2)就绪(ready)态:进程具有运行条件,等待系统分配处理器以便运行。
(3)等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具有运行条件,正在等待某个事件的完成。
16.线程进程区别
  • 进程是资源分配的最小单位,线程是程序执行的最小单位。

  • 进程有本身的独立地址空间,每启动一个进程,系统就会为它分配地址空间,创建数据表来维护代码段、堆栈段和数据段,这种操做很是昂贵。而线程是共享进程中的数据的,使用相同的地址空间,所以CPU切换一个线程的花费远比进程要小不少,同时建立一个线程的开销也比进程要小不少。

  • 线程之间的通讯更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通讯须要以通讯的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

  • 可是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另一个进程形成影响,由于进程有本身独立的地址空间

17.git和svn的区别

  • git是分布式的,svn是集中式的
  • git 只关心文件数据的总体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差别。
  • git大部分操做无需联网,若无网络,能够先提交的本地,等到有网络后,提交的服务器。而svn只能依赖于网络查看和更新。(git的commit必定要频繁)
  • git的克隆很快,可是svn很慢。
  • svn有bug,可能形成提交丢失,git使用 SHA-1哈希值进行校验。

18.Spring Bean的生命周期

  • 实例化
  • 设置其属性值
  • BeanNameAware的setBeanName方法
  • BeanFactoryAware的setBeanFactory方法
  • BeanPostProcessors的postProcessorBeforeInitailiztion方法
  • InitializingBean的afterPropertiesSet方法
  • Bean标签中init-method属性中的方法
  • 使用bean
  • DisposableBean中的destory方法
  • Bean标签中destory-method方法

19.事务

  事务的四个特性:

    A:原子性,一组操做要么所有执行,要么所有不执行。

    C:一致性,数据库老是从一个一致性状态转换为另一个一致性状态。

    I:隔离性,一个事务所作的操做在提交之前,对于其余的事务是不可见的。

    D:持久性,事务一但提交,那么所作的修改会永久保存到数据库中。

  事务的四种隔离级别:

    read uncommitted,未提交读,事务中的修改,即便没有提交,对其余事务也都是可见的。事务能够读取未提交的数据,称为脏读。

    read committed,提交读(也叫不可重复读),大部分数据库是这种隔离级别,一个事务从开始直到提交以前,所作的任何修改对其余事务都是不可见的。两次执行一样的查询,可能获得不同的结果。若是一个事务在提交数据以前,另外一个事务能够修改和删除这些数据,就会发生不可重读。

    repeatable read,可重复读,保证两次读取的数据结果是一致的。可是会产生幻行,当某个事务在读取某个范围内的记录时,另一个事务又会在该范围内插入新的记录,再次读取时会产生幻行。MySql的默认隔离级别。

    serializable,可串行化,强制事务串行,读取的每一行加锁。

  MVCC:保存数据在某个时间点的快照。每行记录后面有两个隐藏列,一个保存了行的建立时间,一个保存了删除时间。

20.索引

  索引是什么以及他的做用,必定要弄明白。若是能够的话,建议查看《高性能MySQL》这本书的第五章。

  索引(MySQL中也称为“键(key)”):是一种数据结构,存储引擎用来快速找到记录的一种数据结构,这是索引的基本功能。我以为不仅是存储引擎,日常中的文件也是能够应用索引的,由于本质上都是存储在磁盘上的文件。不知道理解的对不对。

  索引能够包含一个或多个列的值。若是有多个列,那么列的顺序也十分重要。

  MySQL的经常使用的索引类型有4种:BTree、哈希索引、空间数据索引(R-Tree)、全文索引

  对于BTree类型的索引,通常来讲使用B-Tree,可是Innodb使用的是B+Tree,NDB集群使用的为T-Tree(虽然他也叫BTree)。B-Tree适用于全键值、键值范围、最左前缀查找

    B-Tree的缺点:

      • 若是不是按照索引的最左列则没法使用索引。
      • 不能跳过索引中的列。若是有3个列为一个索引,若不指定第二个列,则没法使用第三个列只能使用第一个列。
      • 若是查询中有某个列的范围查询,则其右边的全部列都没法使用索引优化查找。例如若指定3个列last_name、first_name、create为索引,如有查询where last_name='bob' and first_name like 'J%' and create='2000-01-01',则只能使用last_name、first_name,在范围查询first_name右边的create列是没法应用索引的。

  哈希索引:它基于哈希表实现,只有Memory引擎显示支持哈希索引(NDB也支持)。固然,Memory也支持B-Tree,当发生冲突时,使用链表方式存放。其查找速度很是快。

    哈希索引的缺点:

      • 只包含哈希值和行指针,不存储字段值,因此不能使用索引中的值来避免读取行。
      • 不是按照索引值顺序存储,因此没法用于排序。
      • 不支持部分索引列匹配查找。例如,在列A和B上创建哈希索引,若是查询中只有A,那么不能使用该索引。
      • 最主要的缺点是只支持等值比较查询,即=、IN()、<=>(彻底等于),不支持范围查找,如where price > 100
      • 虽然说访问哈希索引的数据很是快但当有许多哈希冲突时,会遍历链表的全部行指针,稍慢。
      • 当哈希冲突不少时,索引的维护代价较高。

    适应场景:适用于星型Schema(须要关联不少查找表)。其实还能够和InnoDB引擎的B-Tree结合,即在B-Tree树的基础上建立一个伪哈希索引。它使用哈希值而不是键自己进行索引查找。只须要很小的索引就能够为超长的键建立索引。例如当存储大量URL,并根据URL进行搜索查找时,若是使用B-Tree存储URL,那么内容将会很大,这时咱们能够新增一个被索引的列url_crc,可使用CRC32作哈希。查找时Select id from url where url_crc=CRC32("http://www.mysql.com") and url="http://www.mysql.com",这样将很快找到相应的数据。若是对完整的URL字符串作索引,那么将很是很是慢。  可是这样须要维护索引,可使用触发器。(不能使用SHA1和MD5做为哈希函数)

21.分布式一致性理论

  CAP理论:

    Consistency:一致性,数据在多个副本之间可否保持一致的特性。一个系统在数据一致的状态下执行更新操做后,应该保证系统的数据仍然处于一致的状态。

    Availability:可用性,系统提供的服务一致处于可用的状态。

    Partition Tolerance:分区容错性,遇到故障时,仍然须要可以保证对外提供知足一致性和可用性的服务。

    考虑ca和ap。

相关文章
相关标签/搜索