2012-04-06 8 views
0

スワップを減らすために、Javaアプリケーションのメモリフットプリントを減らしたいと思います。私はこの目的のためにスタックサイズ(Xssパラメータ)を減らすことを考えていましたが、スタックメモリの割り当て方法やスレッドあたりのデフォルトの512k(32ビットOS用)が常駐メモリにどれくらいあるかは関係ありません実際に使用されます。Javaはメモリを節約するためにスタックサイズを小さくします。

スタックメモリの減少は、スワッピングの減少につながりますか?

更新:アプリケーションをプロファイルすることはお勧めしません。すでに完了しています。

+1

スタックサイズを信じるようにあなたを導くたものは問題ですか? – JaredPar

+0

問題は十分なRAMがなく、メモリを切る必要があり、ヒープまたはパーマゲンから切り離す方法がわかりません。 –

+2

この問題を修正するための最初の手順は、アプリケーションをプロファイルすることです。メモリを使い果たしていることが分かるまでは、本質的に推測しており、存在しない問題に時間を費やす可能性が非常に高いでしょう。プロファイラーは、アプリケーションでメモリを占有しているものについての直接的な情報を提供します。これはおそらくあなたがそうしているとは思わないものです。 – JaredPar

答えて

0

はい、それはもちろん、そのLIFOの最初のうちで最後のルール、あまりスタックあまり使用しているとどのくらいあなたが保存する必要がありますどのくらいのメモリ

0

を交換しますか?

スタックだけ512Kスレッドごとにあるので、それはあなたが(100Mbの)保存価値があるかもしれない値の入力を開始するために200個のスレッドを必要とする意味

スタックメモリの使用は、「非常にしばしば」Iだろうので、それをスワップアウトするのは悪い目標だと考えています。あなたはメモリ制約された環境を扱っていない限り?

+0

まさに、それは記憶に制約された環境です。 –

+0

くそー、私は言及するのを忘れました。最も簡単なことは、それを試して実際に役立つかどうかを確認することです。 あなたのアプリは640MBを使用するように設定されていますが、ターゲットマシンにはどれくらいのメモリが搭載されているのですか? – pimaster

+0

これは計算が難しく、そのマシン上で実行され、メモリ消費量が少ない他のプロセスもあります。オペレーティングシステム自体にどれくらいのメモリが必要かを言うのは難しいです。 –

5

実行しているスレッドの数はいくつですか?膨大な数のスレッドと非常に寛大なスタックサイズ(例えば、10kスレッドと256KBのスタックサイズ)でも、2GBのヒープスペースしかありません。

あなたは32ビットのJVM上で動作していると言いますから、これは比較的小さなシステムだと思います。いくつかのオプションがあります:

  • 64ビットJVMに切り替えます。今やあなたはたくさんのアドレス空間を持っており、スタックのサイズは重要ではありません。

  • あなたのマシンは小さすぎます。あなたの10k +スレッドで2GBのスタックが問題になる場合は、あまりにも小さなマシン上でアプリケーションの「大きすぎる」実行をしています。問題は、他の場所で実際には、あなたは間違ってツリーを吠えているあなたのスレッド数の削減

  • をより多くのハードウェア

  • をソフトウェアで以下の操作を行いますか買う

+0

OPは、スワップしていると主張します。つまり、アドレス空間を使い果たしてしまうのではなく、物理メモリです。その問題を悪化させるだけで64ビットに切り替えることはできませんか? – trutheality

+0

メモリが制限された環境です。 Xmxの値は640 MB、数百のスレッドがあります –

+1

@Artiom *何百ものスレッド?非常に強力なサーバだけが、このような多数のスレッドを同時に処理することができます。 ThreadPoolsを調べるべきでしょう。 – Voo

関連する問題