Java開発者はガベージコレクションアルゴリズムについて知っておくべきですか?[閉まっている]


11

最近、ガベージコレクションアルゴリズムについて知っているかどうかインタビューで尋ねられました。

ガベージコレクションとは何であるかは知っていましたが、開発者として心配する必要はなく、ガベージコレクタがすべてのハードワークを行っているため、ガベージコレクションアルゴリズムについて学ぶことを考えたことはありませんでした。

Java開発者はガベージコレクタアルゴリズムについて知っておくべきだと思いますか?「はい」の場合、どちらを調べる必要があるか教えてください。


これを参照してください、chaoticjava.com
posts

1
はい、そうすべきです。そうでなければ、彼らは重い負荷の下で壊れるソフトウェアを書く危険を冒します。
quant_dev

回答:


9

ソフトウェアプラットフォームではなく「標準ソフトウェア」を開発する場合、ガベージコレクションアルゴリズムを知ることはまったく重要ではないと思います。ガベージコレクタがどのように機能するかについての基本的な理解が必要です。ガベージコレクションによるソフトウェアの重大な遅延が発生する場合、またはメモリ使用量を最適化する必要がある場合を除きます。

これらのアルゴリズムに興味がある場合は、私の次の投稿をご覧ください:ローポーズGCの背後にあるアルゴリズムは何ですか?


7

ガベージコレクションは、興味深い、重要なコンピューターサイエンスの問題です。

そのアルゴリズムを知って理解することは、これらのアルゴリズムに非常に深い関心と理解があることを示しています。JavaのGCアルゴリズムを勉強していない場合でも、誰かがどのデータ構造とアルゴリズムが使用されるかについての合理的な説明を提供できるかどうかに感銘を受けます。

Javaプログラマーとしては、開発者がGCの長所と短所を説明できればよいでしょう。GCには、その実装方法に関する知識が少し含まれています。これは、単に受動的に使用するのではなく、使用するツールがどのように機能するかに興味があることを示します。コストを知ることは、コストを最小化する方法でプログラミングするのにも役立ちます。

これは、Java開発者として生計を立てるための「必要な知識」とは言いませんが、今日の仕事を達成するために知っておく必要があることよりも少し深く、進んで進んでいくことができることを示すプラススキルです。


2
私が同意する基本を理解していること(物事を理解することでより良いコーダーになります)。問題は、複雑な詳細を知ってuse that informationからコードを設計する場合です。これにより、GCが改善され、GCが保持されなくなり、コードが最適でなくなるという仮定(および最悪の場合はGCが妨げられる可能性があります)に関する仮定が発生する可能性があります。知っておくと便利ですが、特定の実装を念頭に置いていないベストプラクティスを使用してコードを設計する必要があります。コンパイラとGCは常に改善されており、マクロの最適化は最終的には役に立たなくなります。
マーティンヨーク

私はString、実装方法について何かを知っていれば+、ループで使用して文字列に連結しないという線に沿ってもっと考えていました。
-JohnMcG

4

ガベージコレクター(または任意のアルゴリズム/テクノロジー)がどのように機能するかを知る必要がある2つの理由がわかります。それらは次のとおり
です。1.書いたコードの下で何が起こっているかをよりよく知ることができます。これにより、多くの場合、より効率的なコードを記述でき、パフォーマンスが向上します。場合によっては、これは重要です。(私は、GWTはブラウザのガベージコレクタに頼った不愉快な経験を持っていた、と私たちはクロームを持つ巨大なメモリリークが発生していました。私たちは、正確に漏れを起こしたかを確認しなければならなかったので。)
2.このようなアルゴリズムは常に(あるいはほとんど常にあり、いいえ、常に)スマートで、熟練した、資格のある、経験豊富な開発者に信頼されています。したがって、彼らのアプローチを研究することは非常に有用です。

インタビューでそのような質問をされたもう一つの理由がわかります。一部の開発者(特に私の元同僚)は、開発者がそのようなことを知らない場合、開発者は十分に頭が良くないか勤勉ではないと考えます。私はこの声明に同意しません。しかし、とにかく、そのようなことを知ることは、あなたのインタビュアーに感銘を与える良い方法です。


1
(2)と(1)の半分に同意します(デバッグに役立ちます)。ただし、(1)には危険があり、GCが改善されるか、異なるタイプのGCを使用する実装に移行すると、GCが最適ではなくなるという点で、GCの特定の実装で動作するようにコードを設計します。
マーティンヨーク

@Loki Astari、あなたはそれが特定の実装にとって危険であることについて正しいです。ただし、一方で、.NETのガベージコレクションの原則など(少なくとも長い間)変わらないものもあります。
superM

@superM:実際、MonoのGCはMicrosoftのGCとは大きく異なり、まったく別のGCに置き換えられる過程にあります。
ヨルグWミットタグ

@superM:私にとってJavaの進化はそれほど遅くないようです:en.wikipedia.org/wiki/Java_version_history(年に一度新しいパッチまたは更新があるように見えます)。来年の新しいリリースで。これは、GCが毎回更新されるという意味ではなく、その可能性を示しています。
マーティンヨーク

@Loki Astari、そうです。ソフトウェア開発の多くは急速に変化し続けており、私たちの仕事はそれに追いつくことです。また、すべての変更は既存のものに基づいているため、1つまたは2つのバージョン内での根本的な変更は期待できません。
-superM

4

世代別ガベージコレクション、およびJavaガベージコレクション(PermGen、Eden、Tenuredスペース)の詳細について知っておく必要があります。また、一般的なガベージコレクションに精通している必要があります(参照カウントが通常悪い考えである理由や、マークアンドスイープが優れている理由など)。また、いくつかの代替実装(AzulのZing JVMの「一時停止のない」GCやIBMのリアルタイムメトロノームプロジェクトなど)を読むことをお勧めします。


3

次の2つの理由から、Javaのガベージコレクションがどのように機能するかについてある程度の知識が必要です。

まず、どのように機能するかわからない場合、実際のアプリケーションで最悪の場合のパフォーマンスにつながる設計上の決定を誤って行う可能性があります。GCが向上するにつれて、これはますます少なくなりますが、アプリでアルゴリズムを選択できる場合は、GCについて何かを知っていれば、それが原因であることに気付く代わりに、何をするのかを知っているものを選ぶことができます良くない行為。

第二に、それがどのように機能するかわからない場合、特定のアプリケーションのGCを調整することはできません。ほとんどのJavaプログラマーは、ほとんどの場合デフォルトのパラメーターで十分に機能するため、GCを調整する必要はありません。その「ほとんどの時間」から抜け出す何かを行うと、GCパラメータを調整していることに気付くかもしれません。GCを知らずにこれを行うと、ノブがランダムに回転するだけです。そこから何か便利なものが得られるかもしれませんが、事態を悪化させる可能性が高くなります。

したがって、優れたJavaプログラマーがGCについて太陽の下ですべてを知っているとは思わないでしょうが、プログラマーがJVMのGCがどのように関数を使用しているか、そしてそのためのトレードオフが何らかのレベルでわかることを期待しますGCアルゴリズム。


1

はい、すべてのJava開発者は、仮想マシンの背後で何が起こっているのかを確実に知っておく必要があり、それにはガベージコレクションの作業が含まれます。

知識のレベルは別の質問です。通常の開発者が実際の実装の違いを説明することは期待していません(私はそれを自分で調査する必要があります)が、GCが何をするか、メモリを管理することに対する賛否両論の基本原則晴れ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.