面接問題:「java GCはいつ、何に対して、何をしましたか?」

3532 ワード

面接テーマ:地球人はすべて知っていて、Javaはごみ収集器というものがあって、それは作成する対象にc/cppのようにdelete、freeを落とす必要がなくて、あなたは話をすることができて、GCはいつ、何に対して、何をしましたか?
一.答え:いつ?
1.システムが空いているとき.
分析:この答えは約30%を占めていますが、出会ったら普通は別の話題に転向するつもりです.例えば、アルゴリズム、例えばSSHで彼の得意な他の面を発掘できるかどうか見てみましょう.
2.システム自身が決定し、予測不可能な時間/System.gc()を呼び出すとき.
分析:この答えは約55%を占めており、ほとんどの新卒者がこの答えに答えることができるが、少なくとも間違いではないだろう.言語表現が答えを漠然としているのか、それともそれ自体がこのような漠然とした認識を持っているのかを細分化しなければならない.
3.新生代、古い年代の構造を言い出すことができて、minor gc/full gcを提出することができます
分析:このレベルになると、基本的にGCの運営について概念的な理解があると言えます.例えば、「JVM仮想マシンに深く入り込む」などを見たことがあります.この部分は10%未満です.
4.minor gc/full gcのトリガ条件、OOMのトリガ条件を説明でき、GCのチューニングを低減する策略.
分析:いくつかの私の期待する答えを列挙します:edenはminor gcを満たして、古い年代の対象に昇格して古い年代の残りの空間full gcより大きくて、あるいは小さい時HandlePromotionFailureパラメータによってfull gcを強制されます;gcと非gcの時間がGCTimeRatioの制限を超えてOOMを引き起こし、NewRatioで新生代の古い年代の割合を制御したり、MaxTenuringThresholdで高齢者になる前の生存回数を制御したりするなど...この段階は私に高い期待をもたらすと答えられ、もちろん面接の時は正常な人はすべてのパラメータのスペルを覚えていません.自分でこの話を書いたときもマニュアルをめくったことがあります.この部分は2%未満だと答えた.
まとめ:プログラマは時間を具体的に制御できず、システムが予測できない時間にSystem.gc()関数を呼び出す場合.もちろん、NewRatioでnewObjectとoldObjectの割合を制御し、MaxTenuringThresholdでoldObjectに入る回数を制御し、oldObjectの記憶空間をfull gcに遅延させることで、タイマがgc時間遅延OOMの時間遅延を開始し、対象生存期間を延長することができる.
二.答え:何に対して?
1.使用しないオブジェクト.
解析:答えがないことに相当し、質問はどの相手が「使わない相手」なのかということです.約30%を占めています.
2.役割ドメインを超えたオブジェクト/参照数が空のオブジェクト.
分析:この2つの答えは60%も立っていて、かなり高い割合で、学校がjavaを教えるときに先生がこのように教えたと推定されています.最初の答えは私の疑問を解決していません.gcはいったいどのような対象が役割ドメインにいないかをどのように判断しますか?カウントを引用して対象が収集可能かどうかを判断するには、obj 1、obj 2がGCされるかどうかを面接者に分析してもらう例を補足します.
    class C{
         public Object x;
    }
    C obj1、obj2 = new C();
    obj1.x = obj2;
    obj2.x = obj1;
    obj1、obj2 = null;

3.gc rootから検索を開始し、検索できないオブジェクト.
  :     、         ,  5%         ,           “    ” 。              。
PS:             、   、   、       ,        ,     。

4.rootから検索できず、最初のタグ、クリーンアップを経ても、復活したオブジェクトはありません.
分析:私が期待している答え.しかし、确かに面接者がこれに答えることは少ないので、私の心の中で3点目はすべての点数をあげますと答えました.
まとめ:役割ドメインまたは参照カウントを超えたオブジェクト.gc rootから見つからないオブジェクトを検索し、タグ付け、クリーンアップを経ても復活したオブジェクトはありません.
三.答え:何をしますか.
1.使用しないオブジェクトを削除し、メモリ領域を空けます.
  :   2   。40%。

2.他のスレッドの実行を停止したりfinalizeを実行したりするなどの説明を補足します.
分析:少なくとも質問を具体化しましたが、答え1のように答えの中で話題を見つけて展開し続けるのは難しいです.約40%を占めています.面接で一番怖い答えは「この質問は言えませんが、出会ったときはインターネットで検索してできます」です.プログラム开発は确かに茴香豆の「茴」を锻えるのではなく、いくつかの书き方があります.无駄に覚えないで同意します.私は文法や単语を直すことはできませんが、いくら考えを言っても、ネット検索に直接答えなければなりません.応募者を评価できる情报を得ることはできません.答えから话题を発掘して讨论を続けるのも难しいです.できるだけ自分になじみのある、議論できる分野に答え、面接官の得意な面を見せることをお勧めします.
3.新世代がやっているのはコピークリーンアップ、from survivor、to survivorが何をしているのか、古い世代がやっているのはマーククリーンアップ、マーククリーンアップ後の破片が整理されているかどうか、コピークリーンアップとマーククリーンアップに何かメリットとデメリットがあるかなどを言えます.
分析:「JVM仮想マシンに深く入り込む」を見たことのある基本的な答えでもありますが、実はここまで楽しみにしています.同じ10%未満です.
4.3以外にも、シリアル、パラレル(チップを整理/整理しない)、CMSなどの収集器が機能する年代、特徴、優劣を明らかにし、収集器の選択を制御/調整する方法を説明することができる.
  :   2       。 

まとめ:使用しないオブジェクトを削除し、メモリ領域を回収します.デフォルトのfinalizeを実行します.もちろん、プログラマはすぐに呼び出したい場合はdipose呼び出しでファイルハンドルなどのリソースを解放します.JVMはfrom survivor、to survivorでタグクリーンアップし、オブジェクトをシーケンス化して復活させることができます.
決してネット上のgoogleの下で言わないでください、たとえ自分が以前このような問題に出会ってどのように処理したのかを言っても、この知識に対してどんな認識の考えがあって、それから試験官に聞き返すことができて、このように技術型の試験官がどのように話題を続けてあなたに対して無言であることを譲ることができなくて、ああ.