済南市の国有企業における技術面接の質問の見直し

背景

国営企業との技術面接。役職は上級 Java 開発エンジニアです。個人的な状況: Java 開発で 8 年の経験があります。普段から学ぶことが大好きです。高度なソフトウェア試験の証明書を持っていますが、チームを率いたことはありません。
上級の募集要項を見ると、アーキテクトの要件に追いついてきたように感じ、技術リーダーとしては申し訳ない気持ちもありますが、上にアーキテクトがいれば、困ったことがあればいつでも相談することができます。この動作ステータスは非常に良好であるはずです。OK 面接官は3名で、技術担当が2名、人事担当が1名です。よく言われるように、面接はロケットの組み立てとネジの締め方です。まさにその通りです。質問は原理に関するものばかりです(使い方ではなく、この○○がどのように設計されているのか、長所と短所?難しすぎます)。 . このインタビューのテクニックは以下のとおりです
質問の振り返りです 回答は個人的な意見です 間違いがあればご批判、修正をお願いします コレクション支援ありがとうございます。

1. マルチスレッドの基本パラメータは何ですか?

CorePoolSize、MinimumPollSize、AliveTime、Unit、WorkQueue、ThreadFactory、Stragetory では、
各パラメーターの概念と、次のような一般的なタスク処理プロセスについて説明します。
(1) タスクをサブミットし、スレッド プール内に残っているコア スレッドの数が以下の場合スレッド数 corePoolSize、スレッド プールは、送信されたタスクを処理するためのコア スレッドを作成します。
(2) スレッド プール内のコア スレッドの数がいっぱいの場合、つまりスレッドの数が corePoolSize と等しい場合、新しくサブミットされたタスクはタスク キュー workQueue に入れられ、実行のためにキューイングされます。
(3) スレッドプールの生存スレッド数がcorePoolSizeと等しく、タスクキューworkQueueも満杯の場合、スレッド数がmaximumPoolSizeに達しているか、つまり最大スレッド数が満杯であるかどうかを判定します。 、送信を実行する非コアスレッドを作成します。
(4) 現在のスレッド数がmaximumPoolSizeに達し、新しいタスクが来ると、拒否ポリシーが直接使用されます。
面试官进一步提问了有哪些拒绝策略?

1.AbortPolicy – スレッド プールに追加されたタスクが拒否されると、RejectedExecutionException 例外がスローされます。
2.CallerRunsPolicy – タスクがスレッド プールに追加されて拒否された場合、スレッド プールで現在実行中のスレッドが、拒否されたタスクを誰が処理するかを決定します。
3.DiscardOldestPolicy – スレッド プールに追加されたタスクが拒否されると、スレッド プールは待機キュー内の最も古い未処理タスクを破棄し、拒否されたタスクを待機キューに追加します。
4.DiscardPolicy – スレッド プールに追加されたタスクが拒否されると、スレッド プールは拒否されたタスクを破棄します。

2. スレッド プールはどのように実装されますか?

スレッドプールは実際に内部でプロデューサ/コンシューマモデルを構築し、タスク管理部分がプロデューサとして機能し、タスクがサブミットされると、低速プロセスプールがその後のタスクのフローを決定します(タスクを実行するスレッドを直接申請し、キューにバッファリングします)、実行を待機し、タスクを拒否します)。スレッド管理部分はコンシューマであり、スレッド内で均一に維持され、タスク要求に従ってスレッドを割り当てます(スレッドがタスクを完了すると、実行する新しいタスクを取得し続け、最終的にスレッドがそれ以上取得できなくなるとリサイクルされます) )。

3. ThreadLocal はどのように保存されますか?

ThreadLocal は、スレッド間のデータの相互干渉を防ぐことができるデータ構造です。各スレッドは内部的に Map (キー、値) データ形式である ThreadLocalMap を保持しており、キーは弱参照 (ThreadLocal そのもの)、値はスレッド変数の値を格納します。ThreadLocal が set メソッドを実行すると、その値は現在のスレッドの threadlocals 変数に保存され、get メソッドが実行されると、現在のスレッドの threadlocals 変数からも取得されます。
余談: ThreadLocal 如何解决 Hash 冲突?
ThreadLocalMap は HashMap とは異なり、構造が非常に単純で次の参照がないため、ThreadLocalMap でのハッシュ競合を解決する方法はリンク リストではなく、線形検出方法であることを意味します。threadlocals の set メソッドを使用した後、remove メソッドを明示的に呼び出さない場合、メモリ リークが発生する可能性があるため、使用後は忘れずに Remove メソッドを呼び出してください。

4. JVM メモリ モデル (JDK1.8) を理解していますか?

(1)程序计数器: プログラム カウンタは小さなメモリ空間であり、現在のスレッドによって実行されるバイトコードの行番号インジケーターとみなすことができます。各スレッドには独自のプログラム カウンターがあり、スレッドによって次に実行される命令を記録するために使用されます。
(2)Java虚拟机栈: JVM スタックは各スレッドにプライベートであり、ローカル変数、オペランド スタック、中間結果、メソッド呼び出しの戻り値を保存するために使用されます。(JVM スタックのサイズはコンパイラーが作成するときに決定され、そのライフサイクルはスレッドと同じです。): ネイティブ
(3)本地方法栈メソッド スタックは JVM スタックに似ていますが、ネイティブ メソッド (非Java コード)。
(4)Java堆: Java ヒープは、JVM の最大のメモリ領域であり、すべてのスレッドによって共有されます。Java ヒープはオブジェクトのインスタンスと配列を保存するために使用され、ガベージ コレクターによって管理される主要な領域です。
(5)方法区: メソッド領域は、すべてのスレッドによって共有されるメモリ領域でもあり、ロードされたクラス情報、定数、静的変数、およびコンパイラに最適化されたコードを格納するために使用されます。
(6)运行时常量池: ランタイム定数プールはメソッド領域の一部です。コンパイラによって生成されたさまざまなリテラルとシンボル参照が格納されます。これらのデータは、クラスがロードされた後にランタイム定数プールに格納されます。
(7)直接内存: ダイレクト メモリは、Java 仮想マシンによって直接使用されるオペレーティング システムのメモリ空間であり、Java ヒープとは異なり、JVM パラメータ -Xmx および -Xms によって制御されません。

ヒープはガベージ コレクターの主な管理領域です。当然のことですが问内存模型必问垃圾回收算法、これは JDK1.8 と 1.7 の比較にも依存します
ここに画像の説明を挿入します
。最大の違いは、永続世代がメタデータ領域に置き換わることです (どちらもメソッド領域の実装です) )、つまり、JDK8 には PermSize 関連のパラメーター設定がありません。

5. ダイレクト メモリとは何を保存するために使用されますか?

JVM では、直接メモリは ByteBuffer クラスを通じて実装されます。ByteBuffer クラスは、JVM ヒープの外側にメモリを割り当てる方法を提供します。直接メモリは、allocateDirect() メソッドを通じて割り当てることができます。JVM ヒープ メモリとは異なり、ダイレクト メモリは JVM ヒープ サイズによって制限されないため、ネットワーク送信、ファイル IO、データベース操作などの大量のデータの処理に使用できます。このようなシナリオでは、大量のデータを頻繁に読み書きする必要があるため、JVM ヒープ メモリを使用すると、メモリ オーバーフローや頻繁な GC が発生し、プログラムのパフォーマンスに影響を与える可能性があります。
余談: ByteBuffer はどのメモリ領域に配置されますか: ヒープ

6.NIO は Linux でどの IO モデルを使用しますか?

Java の IO モデル: BIO (同期ブロッキング)、NIO (同期ノンブロッキング)、AIO (非同期ノンブロッキング)
Linux (オペレーティング システム): ブロッキング IO、ノンブロッキング IO、IO 多重化、シグナル駆動型 IO、非同期 IO。
回答: Java の NIO は、Linux の NIO に対応しており、Linux ではノンブロッキング IO、IO 多重化、およびシグナル駆動 IO を使用します。Linux の 5 つの基本的な
IO モデルを説明するアニメーションや例が多数あります。理解したい場合は、検索できますか

7. 一般的に使用される電流制限アルゴリズムの 1 つを選択できますか?

古典的な電流制限アルゴリズムには、カウンタ方式、リーキー バケット アルゴリズム、トークン バケット アルゴリズムの 3 つがあります。

  • カウンタの方法は単純かつ粗雑ですが、まずカウンタを保持し、単位期間をウィンドウとして扱い、このウィンドウ内で受信したリクエストの数を記録します。
    数値が現在の制限しきい値より小さい場合はアクセスが許可され、カウンタは +1 されます。数値が現在の制限しきい値より大きい場合はアクセスが拒否されます。現在の時間ウィンドウが経過すると、カウンタはゼロにクリアされます。欠点は、許容しきい値が 10,000 であると仮定すると、カウンタがクリアされる前に 1 秒以内に 10,000 件のリクエストがすべて流入すると、この突然のトラフィックに耐えられなくなることです。
  • リーキーバケツアルゴリズムは、水が満たされて漏れるプロセスとして考えることができます。漏れのあるバケツにはどのような速度でも水が流入し、一定の速度で水が流出します。水がバケツの容量を超えると、水はオーバーフロー、つまり廃棄されます。バケット容量が変わらないため、全体的な速度が保証されます。短所: 突然のリクエストに直面しても、サービスの処理速度は通常と同じです。これは実際には私たちが望んでいることではありません。突然のトラフィックに直面しても、ユーザー エクスペリエンスを向上させ、システムが安定している間にリクエストをより速く処理できるようにしたいと考えています。 . 、通常のトラフィックと同じ方法で処理するのではなく。
  • 令牌桶算法是对漏斗算法的一种改进,除了能够起到限流的作用外,还允许一定程度的流量突发
    トークン バケット アルゴリズムの原理: 現在の制限に従って固定レートでトークンをトークン バケットに入れるトークン管理者がいます。トークンの数がいっぱいで、トークン バケットの容量制限を超えている場合は、トークン バケットを破棄します。システムはユーザーリクエストを受信すると、まずトークンバケットに移動してトークンを要求します。トークンを取得できた場合はリクエストのビジネス ロジックが処理され、トークンを取得できなかった場合はリクエストは直接拒否されます。欠点は、実装が比較的複雑であることです。

8.ハッシュマップはどのように実装されますか?

jdk1.7 では、hashMap のバックボーンは Entry 配列であり、各 Entry にはキーと値のペアが含まれます。HashMap は配列 + リンク リストで構成されます。配列は HashMap の本体であり、リンク リストは主にハッシュの競合を解決するために存在します。配置された配列の位置にリンク リストが含まれていない場合 (現在のエントリの次のエントリが null を指している場合) )、検索、追加などを行います。この操作は非常に高速であり、必要なアドレス指定は 1 つだけです。見つかった配列にリンク リストが含まれている場合、追加操作の時間計算量は O(n) です。まず、リンク リストが走査され、存在する場合は上書きされ、存在しない場合は追加されます。リンクされたリストが長すぎると、リンクされたリストはクエリには適しておらず、追加と削除には適しているため、値のクエリの効率に影響します。オペレーション。

9. Redis フラグメントはどのように生成されますか?

Redis のメモリ断片化には、一般的な理由が 2 つあります。
1. Redis がデータを保存する場合、オペレーティング システムに適用されるメモリ スペースが、データに必要な実際のストレージ スペースよりも大きくなる可能性があります。
2. Redis 内のデータを頻繁に変更すると、メモリの断片化も発生します。
まず、オペレーティング システムのメモリ割り当ての原理について説明します。メモリ アロケータは、実際に要求されたサイズに応じて割り当てませんが、固定サイズのスペースを割り当てます (目的は割り当て数を減らすことであり、割り当てられるスペースは通常は整数です) 2 の倍数)、割り当てられた領域は連続している必要があるため、余分な領域が再度割り当てられず、メモリの断片化が発生する可能性があります。
Redis のメモリ断片化をクリーンアップするにはどうすればよいですか?
Redis4.0-RC3 バージョン (単に新しいバージョンと言うだけです) にはメモリのデフラグメンテーションが付属しており、過度のメモリ断片化率の問題を回避できます。

10. データベースクエリのパフォーマンスを向上させるにはどうすればよいですか?

さまざまな最適化、じっくり考えられる

11. 最後に: mysql の binlog は何をしますか?

他にも mysql に関する質問や、いくつかの基本的なコマンドの使用法があります。

まず自己紹介をしてから、これらの質問 (および退職理由、期待給与などの一般的な質問) に答えるのにどれくらい時間がかかりますか。練習するには、入店してから 30 分かかりました。答えは非常に大雑把であることがわかりますが、仕事でゆっくりと積み重ねて機会を待つ必要があります。

おすすめ

転載: blog.csdn.net/qq_42887496/article/details/132839170