9

私は、パフォーマンスの向上とメモリ消費の削減が主な目標であるいくつかのプロジェクトに携わってきました。しかし、Javaでメモリ消費を制御することはすでに困難であると私を信じてください。

このwikiページは、「Javaプログラムの速度」 について述べています。Javaは、低レベルおよび数値ベンチマークでC++と同等である場合があります。

これらの統計は、時間計算のパフォーマンスベンチマークに大きな違いがあることを実際には示していません。ただし、Javaのメモリ使用量はC ++よりもかなり高くなります。これは、Javaではオブジェクトごとに8バイトのオーバーヘッドがあり、Javaではアレイごとに12バイト(32ビット、64ビットJavaでは2倍)であるためです。上記のwikiリンク。

ここで問題となるのは、Javaのメモリ使用率を最小限に抑えるために人々が講じるすべての対策です。

「より良いプログラムを作成する」ことと「JDKでメモリを正しく調整すること」よりも良い方法は考えられないので、私はパフォーマンスよりもメモリに大きな関心を持っていることに注意してください。

4

4 に答える 4

5

作業内容に応じて、次のようなさまざまなプログラミング手法の恩恵を受けることができます。

  • 実際に使用する前に初期化する変数の量を制限します。
    • ちょうど一般的な良いコーディングのヒント。初期化されてしばらくの間必要とされていない変数は、まだ必要とされていないメモリを保持しているため、リソースを浪費している可能性があります。
  • 該当する場合、静的オブジェクトを介したオブジェクトキャッシング。
    • これは、ループ内のオブジェクトのメンバーのリストを取得する必要があるリフレクションの多いアプリケーションで以前に使用したことがあり、必要になる状況によってはパフォーマンスを大幅に向上させることができます。
  • 該当する場合はオブジェクトプーリング
  • マルチスレッドアプリケーションを作成している場合は、スレッドプーリングを利用して、新しいスレッドの作成と起動の作業量を制限することでパフォーマンスを向上させることができます。
于 2012-09-24T04:26:31.337 に答える
3

Java でメモリを管理する動機は 2 つあります。

1. オブジェクトの頻繁な作成/削除を避ける。

これにより、1 つ以上の実行中のスレッドが中断される可能性があるため、GC が頻繁にウェイクアップするのを回避できます。

一時的/永続的なメモリ ホールを回避する

2. VM の全体的なメモリ消費を削減する

これは、メモリの制約が厳しい環境で VM を実行する場合に必要になります。

理想的には、メモリの観点から、適切に作成された Java プログラムは、上記の両方を試して達成する必要があります。1を達成するには、次のことを行う必要があります。

  • 動的メモリ割り当てではなく、静的メモリ割り当てを優先します。つまり、VM ごとに 1 回割り当てます。

  • 関数内で一時オブジェクトを作成しないようにします。これを行うために、ほとんどのオブジェクトは、オブジェクトを再利用できる reset() メソッドを実装できます。

  • 使用している API を理解します。String を使用すると、
    変更の数だけインスタンスを作成することになります。オートボックスタイプも同様です。

上記のポイントは、ポイント 2 の管理または制御にも役立ちます。

VM のメモリ サイズを常にチェックするには、上記のポイントに加えて、次のことも行う必要があります。

VM の起動時に Xmx フラグと Xms フラグを使用し、それらの値を意図的に必要な値よりも低い値に設定し、 OutOfMemoryError に注意してください。

OutOfMemoryError が発生した場合は、最大 VM サイズを超えていることを意味します。原因を特定し、オブジェクト作成の調整を開始します。

それが役に立てば幸い ...

于 2012-09-24T04:54:50.320 に答える
2

作成するオブジェクトの数を減らし、オブジェクトを短命にする以外に、メモリについてできることはあまりありません。ただし、Javaは、最高のパフォーマンスを得るために許可されているすべてのメモリを引き続き使用します。

于 2012-09-24T04:23:18.913 に答える
2

Javaでメモリ使用率を最小限に抑えるために人々が取るすべての手段は何ですか?

彼らは、アレイの大きさのマイクロテストではなく、小さなベンチマークに注目しています。

Java の参照 (64-JVM でも 4 バイトを使用する) を C++ 共有ポインター (64 ビット プロセスで 48 バイトを使用できる) と比較してみてください。実際のプログラム。

「より良いプログラムを書くこと」と「JDKでメモリを正しく調整すること」よりも良い方法は考えられないので、私はパフォーマンスよりもメモリについて非常に心配しています。

通常は、メモリ プロファイラーを使用するだけで済みます。これにより、Java でのメモリ消費を最小限に抑えることができます。

ほとんどの場合、すべてのバイトを保存するというこの強迫観念は時代錯誤だと思います。PC では、1 バイトのメモリのコストは約 5e-7 セントです。またはあなたの時間の約 2e-6 秒。これらは合計できますが、100 KB しか節約できない場合は、それを行うためにコードを変更する価値はなく、1 GB を節約する場合は、それに数時間費やす価値があるかもしれません. 1 GB 節約したとしても、メモリは再利用できますが、時間は再利用できません。

「メモリが主な制約である場合、Java が必要な理由はありますか?」

数 MB のデバイス、つまり Android フォンよりも小さいデバイスをお持ちの場合は、C が最適な選択であるという点に同意します。少なくともスマートフォンの容量があるデバイスをお持ちの場合は、Java で問題ない可能性があります。

于 2012-09-24T06:28:06.750 に答える