2021/3/23 Tencentインタビュー(片側クール経)デッドロック情報の表示、デッドロックの解決方法(防止)、ガベージを収集する理由、ガベージを収集するタイミング、ガベージコレクションは永続的な生成で発生しますSystem.gc() &ランタイム().gc()

1デッドロック情報を表示するにはどうすればよいですか?

Jstackはデッドロックを表示します:jdkインストールディレクトリのビンの下にjpsと入力し、最初にデッドロックを検出するプロセスを確認します。プロセスのプロセス番号を確認します。テスト:128、次に実行:Jstack -l128;デッドロックを出力します。情報:デッドロック情報。

2デッドロック(防止)を解決するにはどうすればよいですか?

1相互排除条件を破棄します。これは不可能です。2要求と保留の条件を破棄し、すべてのリソースに一度に適用します。3非剥奪条件を破棄します。スレッド1は共有リソースAに適用します。アプリケーションが失敗した場合は、次のことができます。占有されているリソースを積極的に解放します。4循環待機条件を解除し、特定の順序でリソースを申請し、逆の順序でリソースを解放します。

3JVMのガベージコレクションにはプログラムのリサイクルが必要ですか?

必要ありません

4なぜゴミをリサイクルする必要があるのですか?

基本的な理解は、ガベージコレクションが実行されない場合、メモリは遅かれ早かれ消費され、プログラムの通常の動作はGCなしでは保証できません。
ガベージコレクションはメモリをデフラグし、ソートされたメモリを新しいオブジェクトに割り当てます。

5ごみはいつリサイクルされますか?

ときにオブジェクトが にアクセスできなくなり、現在のオブジェクトを使用するアプリケーション 、オブジェクトを再利用することができます。ガベージコレクションは永続世代では発生しません。永続世代がいっぱいであるか、クリティカル値を超えると、完全なガベージコレクション(フルGC)がトリガーされます。ガベージコレクターの出力をよく見ると、永続的な世代も収集されていることがわかります。これが、フルGCを回避するために正しい永続的な生成サイズが非常に重要である理由です。

6ガベージコレクションはJVMの永続的な生成で発生しますか?

ガベージコレクションは永続世代では発生しません。永続世代がいっぱいであるか、クリティカル値を超えると、完全なガベージコレクション(フルGC)がトリガーされます。ガベージコレクターの出力をよく見ると、永続的な世代も収集されていることがわかります。これが、フルGCを回避するために正しい永続的な生成サイズが非常に重要である理由です。Java8を参照してください:永続世代からメタデータ領域へ
(翻訳者注:永続世代はJava8で削除され、メタデータ領域と呼ばれる新しいネイティブメモリ領域が追加されました)

7System.gc()とRuntime()。gc()の違いは?

ここに画像の説明を挿入

どちらも同じです。System.gc()は実際にはRuntime.gc()と同等であり、System.gc()はRuntime.gc()を内部的に呼び出します。
唯一の違いは、System.gc()がクラスメソッドであり、RuntimeがRuntimeであるということです。 .gc()はメソッドの例です。したがって、System.gc()の方が便利です。

8 3つのハンドシェイク?

ここに画像の説明を挿入
クライアントはクローズドフェーズを終了し、パッシブにオープンされたサーバーはクローズドフェーズを終了してリッスンフェーズに入ります。次に、「スリーウェイハンドシェイク」が開始されます。
(1)クライアント->サーバー
最初に、クライアントはTCPメッセージをサーバーに送信します(シーケンス番号はSeq = xであり、シーケンス番号はTCP送信の順序を保証します)フラグビットSYN = 1、「新しい接続を確立する要求」を意味ます

。その後、クライアントは同期送信(同期送信)フェーズに入ります。(2)cli​​ent <-サーバーはクライアントからTCP(seq = x)メッセージを受信した後、 listen(listening)フェーズを終了し、 syn-rcvd(同期的に受信され、TCPメッセージ(Seq = y)返します)に入ります。 )フラグビットACK = 1は、「クライアントから送信されたメッセージシーケンス番号seq = xが有効であり、サーバーはクライアントから送信されたデータを正常受信できることを確認します。SYN= 1は、作成に同意することを意味します。新しい接続」確認番号ack = x + 1(受信が予想される次のメッセージのバイトシーケンス番号を指定)
(3)クライアント->サーバークライアントがサーバーから受信を確認するTCPメッセージを受信した
データ、クライアントからサーバーへのデータを明確にします送信は正常です、SYN-SENT(同期送信)フェーズを終了します次に、クライアントは確立されたフェーズに入り、最後のTCPパケット(seq = x + 1)を返しますその中には、フラグビットACK = 1があります。これは、「サーバーから送信されたメッセージSeqのシーケンス番号が有効であり、クライアントがサーバーから送信されたデータを正常に受信できることを確認する」ことを意味します確認番号ack = y + 1 ;サーバーはsyn-sentフェーズを終了し、確立された(確立された)ステージに入ります。

その後、クライアントとサーバーは通常のデータ送信を実行します。これが「スリーウェイハンドシェイク」プロセスです。

9 4回手を振る?

ここに画像の説明を挿入
(1)クライアント->サーバー
クライアントは接続を解放したいと考えており、TCPメッセージ(Seq = U)をサーバー側に送信します。ここで、マークビットFIN = 1は、「接続の解放要求」を意味します。次に、クライアントはFIN-WAIT -1フェーズ、つまりハーフクローズフェーズに入り、クライアントからサーバーへの方向へのデータの送信停止しますが、クライアントはサーバーから送信されたデータを引き続き受信できます

(2)cli​​ent <-サーバー
はクライアントからTCPメッセージを受信した後、クライアントが接続を解放することを望んでいることを確認しサーバーはESTABLISHEDフェーズを終了し、CLOSE-WAITフェーズ(ハーフクローズ状態)に入ります。 TCPパケット(Seq = V)を返します。ここで
フラグビットACK = 1は、「クライアントからの接続を解放する要求を受信する」ことを意味します。 確認番号はack = U + 1です。クライアントはサーバーからの要求
TCPメッセージの後、サーバーがクライアントから送信された接続解放要求を受信したことを確認し、クライアントはFIN-WAIT-1フェーズを終了してFIN-WAIT-2フェーズに入ります。

(3)クライアント< -サーバーが後に
ACK確認メッセージを送信した、CLOSED-WAITフェーズの後、それがクライアントにサーバーから接続を解除する準備ができて、そして再びクライアントにTCPメッセージを送信する(SEQ = W)、ここで:フラグビットFIN = 1、ACK = 1、これは「接続を解放する準備ができている」ことを意味します。:ここでのACKは、サーバー側メッセージの受信を確認する確認メッセージではありません。確認番号ack = U + 1 ;次に、サーバーはCLOSE-WAITフェーズを終了し、LAST-ACKフェーズに入ります。また、サーバーからクライアントへの方向へのデータ送信を停止しますが、サーバーはクライアントから送信されたデータを引き続き受信できます。

(4)クライアント->サーバー
クライアントは、サーバーから送信されたTCPメッセージを受信し、サーバーが接続を解放する準備ができていることを確認し、FIN-WAIT-2フェーズを終了し、TIME-WAITフェーズに入り、に送信します。サーバーエンドはメッセージ(Seq = U + 1)を送信します。ここで、フラグビットはACK = 1です。これは、「サーバーが接続を解放する準備ができているという信号を受信した」ことを意味します。
確認番号はack = W + 1です。その後、クライアントはTIME-WAITフェーズで2MSLの待機を開始しますクライアントは2MSLを待機した、TIME-WAITフェーズを終了し、CLOSEDフェーズ入り、「 4つの波」。

10接続が確立されたが、クライアントが突然失敗した場合はどうなりますか?

TCPにはキープアライブタイマーがあります。クライアントに障害が発生すると、サーバーは永久に待機できなくなり、リソースが無駄になります。サーバはこのタイマーそれは、クライアントからの要求を受信するたびにリセットされます。時間は通常2時間に設定されているそれは2時間のクライアントからデータを受信していない場合、サーバはその後、すべての75をプローブセグメントを送信し、う1秒に1回送信されます。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