2021/3/23 腾讯面试(一面凉经)查看死锁信息、死锁如何解决(预防)、为什么要回收垃圾、垃圾什么时候回收、永久代中会发生垃圾回收、System.gc() & Runtime().gc()

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不同字符的最小子序列

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zs18753479279/article/details/115156956