最近、ガベージコレクションアルゴリズムについて知っているかどうかインタビューで尋ねられました。
ガベージコレクションとは何であるかは知っていましたが、開発者として心配する必要はなく、ガベージコレクタがすべてのハードワークを行っているため、ガベージコレクションアルゴリズムについて学ぶことを考えたことはありませんでした。
Java開発者はガベージコレクタアルゴリズムについて知っておくべきだと思いますか?「はい」の場合、どちらを調べる必要があるか教えてください。
最近、ガベージコレクションアルゴリズムについて知っているかどうかインタビューで尋ねられました。
ガベージコレクションとは何であるかは知っていましたが、開発者として心配する必要はなく、ガベージコレクタがすべてのハードワークを行っているため、ガベージコレクションアルゴリズムについて学ぶことを考えたことはありませんでした。
Java開発者はガベージコレクタアルゴリズムについて知っておくべきだと思いますか?「はい」の場合、どちらを調べる必要があるか教えてください。
回答:
ソフトウェアプラットフォームではなく「標準ソフトウェア」を開発する場合、ガベージコレクションアルゴリズムを知ることはまったく重要ではないと思います。ガベージコレクタがどのように機能するかについての基本的な理解が必要です。ガベージコレクションによるソフトウェアの重大な遅延が発生する場合、またはメモリ使用量を最適化する必要がある場合を除きます。
これらのアルゴリズムに興味がある場合は、私の次の投稿をご覧ください:ローポーズGCの背後にあるアルゴリズムは何ですか?
ガベージコレクションは、興味深い、重要なコンピューターサイエンスの問題です。
そのアルゴリズムを知って理解することは、これらのアルゴリズムに非常に深い関心と理解があることを示しています。JavaのGCアルゴリズムを勉強していない場合でも、誰かがどのデータ構造とアルゴリズムが使用されるかについての合理的な説明を提供できるかどうかに感銘を受けます。
Javaプログラマーとしては、開発者がGCの長所と短所を説明できればよいでしょう。GCには、その実装方法に関する知識が少し含まれています。これは、単に受動的に使用するのではなく、使用するツールがどのように機能するかに興味があることを示します。コストを知ることは、コストを最小化する方法でプログラミングするのにも役立ちます。
これは、Java開発者として生計を立てるための「必要な知識」とは言いませんが、今日の仕事を達成するために知っておく必要があることよりも少し深く、進んで進んでいくことができることを示すプラススキルです。
use that information
からコードを設計する場合です。これにより、GCが改善され、GCが保持されなくなり、コードが最適でなくなるという仮定(および最悪の場合はGCが妨げられる可能性があります)に関する仮定が発生する可能性があります。知っておくと便利ですが、特定の実装を念頭に置いていないベストプラクティスを使用してコードを設計する必要があります。コンパイラとGCは常に改善されており、マクロの最適化は最終的には役に立たなくなります。
String
、実装方法について何かを知っていれば+
、ループで使用して文字列に連結しないという線に沿ってもっと考えていました。
ガベージコレクター(または任意のアルゴリズム/テクノロジー)がどのように機能するかを知る必要がある2つの理由がわかります。それらは次のとおり
です。1.書いたコードの下で何が起こっているかをよりよく知ることができます。これにより、多くの場合、より効率的なコードを記述でき、パフォーマンスが向上します。場合によっては、これは重要です。(私は、GWTはブラウザのガベージコレクタに頼った不愉快な経験を持っていた、と私たちはクロームを持つ巨大なメモリリークが発生していました。私たちは、正確に漏れを起こしたかを確認しなければならなかったので。)
2.このようなアルゴリズムは常に(あるいはほとんど常にあり、いいえ、常に)スマートで、熟練した、資格のある、経験豊富な開発者に信頼されています。したがって、彼らのアプローチを研究することは非常に有用です。
インタビューでそのような質問をされたもう一つの理由がわかります。一部の開発者(特に私の元同僚)は、開発者がそのようなことを知らない場合、開発者は十分に頭が良くないか勤勉ではないと考えます。私はこの声明に同意しません。しかし、とにかく、そのようなことを知ることは、あなたのインタビュアーに感銘を与える良い方法です。
世代別ガベージコレクション、およびJavaガベージコレクション(PermGen、Eden、Tenuredスペース)の詳細について知っておく必要があります。また、一般的なガベージコレクションに精通している必要があります(参照カウントが通常悪い考えである理由や、マークアンドスイープが優れている理由など)。また、いくつかの代替実装(AzulのZing JVMの「一時停止のない」GCやIBMのリアルタイムメトロノームプロジェクトなど)を読むことをお勧めします。
次の2つの理由から、Javaのガベージコレクションがどのように機能するかについてある程度の知識が必要です。
まず、どのように機能するかわからない場合、実際のアプリケーションで最悪の場合のパフォーマンスにつながる設計上の決定を誤って行う可能性があります。GCが向上するにつれて、これはますます少なくなりますが、アプリでアルゴリズムを選択できる場合は、GCについて何かを知っていれば、それが原因であることに気付く代わりに、何をするのかを知っているものを選ぶことができます良くない行為。
第二に、それがどのように機能するかわからない場合、特定のアプリケーションのGCを調整することはできません。ほとんどのJavaプログラマーは、ほとんどの場合デフォルトのパラメーターで十分に機能するため、GCを調整する必要はありません。その「ほとんどの時間」から抜け出す何かを行うと、GCパラメータを調整していることに気付くかもしれません。GCを知らずにこれを行うと、ノブがランダムに回転するだけです。そこから何か便利なものが得られるかもしれませんが、事態を悪化させる可能性が高くなります。
したがって、優れたJavaプログラマーがGCについて太陽の下ですべてを知っているとは思わないでしょうが、プログラマーがJVMのGCがどのように関数を使用しているか、そしてそのためのトレードオフが何らかのレベルでわかることを期待しますGCアルゴリズム。