1、三次握手:①客户端向服务器发送syn,并进入syn-send状态,等待服务器确定;②服务器接收到客户端发送过来的syn,必须确认客户端发送过来的syn包,并且自己也会发送一个syn+ack包,进入syn-receive状态;③客户端接收到syn+ack包后,会发送一个ack包,发送完该包,客户端和服务器进入establish状态,完成三次握手。
Syn超时:syn队列满后,通过syn-cookies参数回发syn-cookie
向对方发送保活探测报文
2、四次挥手:①客户端向服务器发送FIN,用来终端客户端到服务器的数据传输,并进入FIN-WAIT状态;②服务器收到客户端发送过来的FIN后,发送一个ACK包,并进入close-wait状态;③服务器向客服端发送FIN,用来终端服务器到客户端的数据传输,并进入LAST-ACK状态;④客户端接收到FIN后,进入TIME-WAIT状态,接下来发送一个ACK包,该包发完,服务器进入close状态
2ml-需要足够的时间等待对方接收到ACK包,避免新旧连接混淆
Close-wait:对方关闭socket连接时,我方忙于读写,没有及时关闭连接
3、TCP和UDP区别:①TCP是面向连接的,UDP是面向非连接的②TCP提供可靠服务,而UDP不提供可靠服务③UDP具有较好的实时性,效率比TCP高④每个TCP连接只能是点对点的,而UDP支持一对一,一对多,多对多⑤TCP对资源要求比较高,UDP对资源要求低
4、HTTP请求过程:客服端连接web服务器,发送http请求,服务器接收请求并返回响应,释放TCP连接,浏览器解析渲染界面
5、HTTP请求方式:get,put,post,options,head,trace
6、Url:DNS解析,TCP连接,发出http请求,服务器接收请求并作出响应,浏览器解析渲染界面
7、状态码:100:指示信息,服务器已接收到请求,继续处理;200:服务器已成功处理请求;300:重定向;400:请求发生错误,妨碍了服务器处理;500:处理请求时,服务器发生内部错误
8、Get和post区别:①get的请求放在URL中,而post放在请求体中;②get符合幂等性、安全性,post不符合;③get可以被缓存,被储存,而post不可以
9、Session和cookie的区别:①session放在服务器端,cookie放在客户端②session可以存放在数据库、文件、内存中,默认被存在服务器的一个文件里③session的运行依赖session-ID,而session-ID存放在cookie中,意味着当客户端禁止了cookie,session也不能正常使用④用户验证一般使用cookie;⑤cookie要比session安全;⑥若想减轻服务器的负担,建议使用cookie
10、http和HTTPS的区别:HTTPS需要到CA申请证书,而http不需要;HTTPS默认端口是443,而http默认是80;HTTPS=认证+加密+可靠性;比http安全
11、Socket:①服务器:创建一个socket,绑定端口,监听端口,接受客服端发来的请求,从socket中读信息,关闭socket;②客户端:创建一个socket,连接端口,向socket里写信息,关闭socket
12、密集索引和稀疏索引的区别:密集索引文件的每一个搜索码都对应一个索引值;稀疏索引文件只为搜索码的部分文件创建索引项
13、调优SQL:①根据慢日志定位慢SQL;②使用explain的工具解析SQL;③让SQL走索引
14、MYISAM:默认使用表级锁,不支持行级锁。适用于:频繁执行count语句;对数据的增删改不频繁,查找比较频繁;没有事务
15、INNODB:默认使用行级锁,也支持表级锁。适用于:对数据的增删改查都比较频繁;可靠性要求高,支持事务
16、更新丢失、脏读、不可重复读、幻读
17、Linux
18、编译到执行的过程:首先编辑器将root.java原文件编译成root.class字节码文件;然后classloader将字节码文件转译成JVM中的class<root>对象;最后JVM中的class<root>对象实例化为root对象
19、双亲委派模型:避免多份同样的字节码加载
20、类加载:new类名,new的参数定位符引用,找不到的类进行加载,分配内存空间,内存空间初始化为0,调用init方法
21、对象加载:加载,验证,准备,解析,初始化
22、类加载有两种方式:隐式加载(new),显示加载(loadclass、forname)
23、Loadclass和forname的区别:forname获得的对象是已经初始化的,而loadclass得到的对象还没有进行连接
24、标记-清除:碎片化 复制:解决碎片化,顺序分配内存,简单高效,适用于对象存活率低的场景 标记-整理:避免了内存的不连续性,不需要两块内存
25、强引用、软引用(内存不足)、弱引用(垃圾回收)、虚引用(引用队列)
26、String字符序列不可以改变、stringbuffer和stringbuilder可以改变、stringbuffer是多线程操纵大量数据、线程不安全,stringbuilder是单线程操纵大量数据、线程安全
27、Collection体系:分为list和set(list是有序的不唯一的,二set是无序的唯一的),list分为数组(增删慢,查找快)和链表(查找慢,增删快),数组分为Arraylist(线程不安全)和vector(线程安全),链表是linkedlist(线程不安全),set分为hashset、treeset
28、Hashmap、hashtable、concurrenthashmap区别:
Hashmap是线程不安全的,是数组+链表+红黑树结构
Hashtable是线程安全的,是数组+链表结构
Concurrenthashmap是线程安全的,是数组+链表+红黑树结构
Hashmap的key值和value值可以修改,而另外两个不可以
29、bean的生命周期:实例化bean、设置对象属性、检测aware相关接口、前置处理、调用bean初始化的方法、后置处理、使用bean、关闭bean
30、http1.0和http1.1区别:http1.0默认使用非持久连接,而1.1使用持久连接;1.0不支持get请求,1.1支持
31、B-tree:每个根结点至少有两个孩子;树中每个节点最多含有m个孩子;除叶子结点和根结点外,树中每个节点至少含有m/2向上取整的孩子;所有的叶子结点位于同一层
32、B+-tree:非叶子节点的指针数与关键字个数相同,非叶子节点只作为索引不存储数据,数据存储在叶子结点中,所有的叶子结点均有一个链指针纸箱下一个叶子结点
33、反射:在运行状态中,任何一个类,都可以知道他的方法和属性,对弈任何一个对象,都可以调用他的方法和属性。作用:Java反射机制可以用来获取class对象或每一个实例化的class对象,还可以获取构造方法、成员方法、成员变量
34、内存溢出:在申请内存时,没有足够的内存供其使用。
原因:内存中加载的数据量过于庞大;集合类中有对象得引用使用完没有消除;代码中存在死循环;使用第三方软件的bug;启动参数内存值设置过小
方法:修改jvm参数,直接加载内存;检测错误日志,查看内存溢出之前有无其他异常;对代码进行走查分析,找出可能存在内存溢出的位置
35、内存泄漏:程序在申请内存后,无法释放已申请的内存
原因:静态集合类没有释放、监听器没有删除、单例模式、各种连接没有关闭
36、死锁:一组进程中各个线程均占有不被释放的资源
条件:互斥条件、请求和保持条件、非剥夺条件、循环等待条件
37、接口和抽象类:
抽象方法的修饰符可以是public、protected等等,而接口默认的是public,也不能使用别的
抽象方法中可以有main方法并且可以执行,而接口没有
抽象方法可以继承一个类实现多个接口,接口可以继承一个或多个接口
抽象方法里可以有构造函数,接口没有
抽象方法里有普通成员变量,而接口里的均被final static修饰
38、final:类不可以被继承、方法不可以被重写、属性不可以被改变
39、Static:修饰成员变量、成员方法;静态代码块;静态导包
40、进程和线程的区别:进程可以看做独立的应用,线程不可以;进行有独立的地址空间,线程没有;线程是进程的不同执行路径;多进程程序要比多线程程序健壮,但多进程程序的切换要比多线程开销大
41、Java中进行和线程的关系:Java对操作系统提供的功能进行封装,包括进行和线程;每个线程对应一个JVM实例,多线程共享JVM里的堆;程序运行会产生一个进行,进程至少包含一个线程;Java采用单线模式进行编程,程序会自动创建主线程;主线程会自动创建子线程,原则上后于子线程完成
42、Start和run的区别:调用start方法会创建一个子线程并启动,run只是thread类的一个普通方法
43、Thread和runable的关系:thread是实现runable接口的类,使得run支持多线程;考虑到类的单一继承原则建议使用runnable接口
44、如何给run方法传参:构造函数传参、成员变量传参、回调函数传参
45、如何实现处理线程的返回值:主函数等待法、调用thread类的join方法阻塞当前线程等待子线程处理完毕、通过callable接口实现
46、Sleep和wait的区别:sleep是thread类的方法,wait是object类定义的方法;sleep可以使用在任何地方,wait只能只用在synchronized修饰的代码或方法;sleep只会让出CPU,不会导致所的行为发生改变,而wait不仅让出CPU还会释放已经占用的同步资源锁
47、Notify和notifyall
48、Yield:当调用thread.Yield方法时,会给线程调度器一个当前线程愿意让出CPU的暗示,但线程调度器可能会忽略该暗示
49、如何中断线程:调用stop方法、调用interrupt方法、需要被调用的线程配合中断
50、自旋锁:在很多情况下,共享数据的锁定状态持续时间较短,切换线程不值得通过让线程执行忙循环等待所的释放,不让出CPU
51、四种锁状态:无锁、偏向锁、轻量级锁、重量级锁
偏向锁:优:加锁和解锁不需要CAS操作,不会带来额外的性能开销,和执行非同步方法想比仅差纳秒级差距;缺:如果线程间存在竞争,会带来锁撤销的消耗;场景:只有一个线程访问同步代码块或同步方法
轻量级锁:优:竞争的线程不会阻塞,提高了响应速度;缺:若线程长时间抢不到锁,会自旋消耗CPU性能;场景:线程交替执行的同步代码块和同步方法
重量级锁:优:线程竞争不使用自旋,不消耗CPU;缺:线程会阻塞,响应速度缓慢,在多线程下,频繁获取和释放锁会带来巨大的性能开销;场景:追求吞吐量、同步代码块或同步方法执行时间较长的场景
52、synchronized和lock的区别
53、Reetrantlock独有的能力
54、sql基础,order by和group by比较重要
55、算法基础