1如何查看死锁信息?
Jstack查看死锁:jdk安装目录的bin下面,输入jps,先查看我们要检测死锁的进程;看到进程Test的进程号:128,然后执行:Jstack -l 128;输出死锁信息:死锁信息;
2死锁如何解决(预防)?
1破坏互斥条件,这是不可以的;2破坏请求与保持条件,一次性申请所有资源;3破坏不剥夺条件,线程1申请共享资源A,如果申请不到,可以主动释放所占有的资源;4破坏循环等待条件,按某一顺序申请资源,释放资源则以相反的顺序。
3JVM的垃圾回收需要程序回收吗
不需要
4为什么要回收垃圾?
一个基本的认识如果不进行垃圾回收,内存迟早被消耗完,没有GC就不能保证程序的正常运行;
垃圾回收还会进行内存碎片的整理,将整理出来的内存分配给新的对象。
5垃圾什么时候回收?
当对象 对当前使用这个对象的应用程序 变得不可触及的时候,这个对象就可以被回收了。
垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。
6JVM中的永久代中会发生垃圾回收吗?
垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区
(译者注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)
7System.gc() & Runtime().gc()的区别?
两者都一样,System.gc()实际上等效于Runtime.gc(),System.gc()内部调用Runtime.gc();
唯一的区别是System.gc()是一种类方法,其中Runtime.gc()是一种实例方法。 因此,System.gc()更方便。
8三次握手?
客户端结束closed(关闭)阶段,被动打开的服务器端也结束closed阶段,并进入 listen(收听) 阶段。随后开始“三次握手”:
(1)client——>server
首先客户端向服务器端发送一段TCP报文(序号为Seq=x,序号确保了TCP传输的有序性),标记位SYN=1,表示“请求建立新连接”;随后客户端进入syn-sent(同步发送)阶段。
(2)client<——server
服务器端接收到来自客户端的TCP(seq=x)报文之后,结束listen(收听)阶段进入syn-rcvd(同步收到,并返回一段TCP报文(Seq=y),标志位ACK=1,表示“确认客户端发送的报文序号seq=x有效,服务器能正常接收客户端发送的数据 , SYN=1,表示同意创建新连接”,确认号ack=x+1(指明下一个期待收到报文的字节序号)。
(3)client——>server
客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT(同步发送)阶段 ,随后客户端进入established(已建立)阶段,并返回最后一段TCP报文(seq=x+1)。其中:标志位ACK=1,表示“确认服务端发送的报文Seq序号有效,客户端能正常接收服务器发送的数据”;确认号ack=y+1;服务器结束syn-sent阶段,进入established(已建立)阶段。
此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。
9四次挥手?
(1)client——>server
客户端想要释放连接,向服务器端发送一段TCP报文(Seq=U) 其中:标记位FIN=1,表示“请求释放连接”;随后客户端进入FIN-WAIT-1阶段,即半关闭阶段,并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
(2)client<—— server
服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文(Seq=V),其中:
标记位ACK=1,表示“接收到客户端发送的释放连接的请求”; 确认号为ack=U+1;
客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段
(3)client<——server
服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文(Seq=W),其中:标记位FIN=1,ACK=1,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。确认号ack=U+1;随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。
(4)client——>server
客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文(Seq=U+1),其中:标记位为ACK=1,表示“接收到服务器准备好释放连接的信号”。
确认号为ack=W+1 ; 随后客户端开始在TIME-WAIT阶段等待2MSL,客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
10如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
11数据结构 排序算法的效率比较
12算法题
1翻转链表
public class ListNode{
int val;
ListNode next;
ListNode(int x){
val = x;
}
}
public ListNode reverseList(ListNode head){
if(head == null || head.next == null){
ListNode last = reverseList(head.next);
head.next.next = head;
head.next = null;
return last;
}
}
2不同字符的最小子序列