2009-07-27 29 views
20

Javaアプリケーションは、別のJavaアプリケーションを実行し、プロセス "java -jar j.jar"を実行します。 J.jarは、与えられたデータセットに応じてたくさんのメモリを使用することが知られており、多くの場合、OutOfMemoryErrorヒープを取得します。ですから、できるだけ多くのメモリを割り当てることができるように、-Xmxを使用したいと思います。私は、システム全体のメモリを取得し、-Xmxの80〜90%を指定することを考えていました。Java -Xmx、システム上の最大メモリ

私の問題に対して解決策はありますか?そして、私のソリューションはどのように鳴りますか?

編集:使用しているメモリがJARファイルをパックするために使用するJavaの組み込みpack200圧縮であるため、メモリ消費量を減らすことはできません。

+3

だから、実際には、システムメモリの量を決定するためにJavaを使用する方法を求めていますか? –

+0

はい、それは1つの可能な解決策であり、あなたが方法を知っているなら、それが分かると分かるでしょう。 –

+0

あなたは64ビットのJVMを実行していますか?あなたが32ビットを実行している場合は、無料のmemが7Gとなった場合、'80% 'のビットに問題が発生します。たとえば、 –

答えて

4

お使いのOSによっては、これは無料で利用できるメモリサイズ取得のために働く可能性があります。そこから

java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean; 
long freeMemory = sunmxbean.getFreePhysicalMemorySize(); 
long availableMemory = sunmxbean.getTotalPhysicalMemorySize(); 

を、あなたは、80〜90%を把握し、必要な最大メモリサイズを使用してjarファイルを起動することができます。

これはすべてのOS(Windows)で動作するのかわかりませんが、OSXとLinuxの両方でテストしたところ、うまくいきました。

+1

ありがとう!私はWindowsとLinuxでこのコマンドを試してみたところ、完全に機能しました。 –

+1

これはsun JVM上でのみ動作するように見えますが、私はIBM JVMにデプロイする必要があるため、sunを使用するすべての人で実行することはできません。 –

0

私があなたに言うことの1つは、あなたのアプリがRAMをいっぱいに近づかせないことです。 Javaアプリは正常にスワップしません。私はガベージコレクションのために、Javaは常にスワップからそのメモリを引き出します。

デッドロックが発生しました。私は、システムがGCを引き起こし、スワップファイルからデータを引き出すメモリをJavaに要求していると思います。この時点で、システムはリセットするまで回転します。

これはたくさんのRAMと多くのスワップ領域(以前のバージョン)と古いJava VMを搭載していたため、走行距離が異なる場合があります。

また、他のアプリをどのように起動しているかによって、別のアプリではなく-Xmsを指定する必要があります。完全なコマンドを与えている場合は-Xmsを指定しますが、単にjarファイルのメインクラスを呼び出す場合は、-Xmsが必要です。 (ああ、あなたが指定した、あなたが呼び出す "Java"コマンドに渡す必要があります。)

0

JarファイルでOSを使用している理由はありますか?アプリケーションとは別のプロセスで実行する必要がない場合は、コードから直接mainメソッドを呼び出すだけで、必要な-Xmxでアプリケーションを起動することができます。

+0

他のアプリケーションを起動するか、アプリケーションを起動するのと同じ問題があります。メインメソッドで他のアプリケーションを実行した場合、まだ多くのメモリを使用できるようにするにはアプリケーションが必要です。 –

0

jconsoleとその他のツールを使用してJavaアプリケーションのトラブルシューティングを行う方法については、blogに完全なブログ記事があります。メモリ使用の制御不足はおそらくメモリリークですが、他の理由も原因である可能性があります。投稿を見て、そのシナリオを複製して、それがあなたの問題を解決したかどうかを確認してください。

http://www.kiragiannis.com/cloud-computing/debug-a-java-application-in-the-cloud/

0

まだ行っていない場合は、メモリプロファイラを通して、あなたのプログラムを実行する必要があります。特定のデータ構造は、もはや使用されていなくても、処分されていないことがあります。 (32 http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

また、その異なるプラットフォームアーキテクチャに基づいて、異なる最大ヒープサイズを持っている点に注意してください:

JProfilerをかなり気の利いたですが、あなたは、Java 5で導入されたHPROFを、使用して同じ情報を得ることができますビットと64ビット)、OS、さらにはJVMをサポートします。

XMLファイルから読み込んだ文字列など、再利用できる値が多い場合は、オブジェクトをプールすることによってメモリ要件が大幅に低下する可能性があります。

13

-XmXの制限は、32ビットウィンドウで-Xmx1500mです。 共有ライブラリはより大きなヒープの方法になります。 これを行うには約2GbのRAMが必要です。

Windows以外のOSでは、大きくすることができ、64Bit JVMにはさらに多くの機能があります。

Windows XPでは3Gb以上のRAMを使用できません(XP SP3以降、4Gb物理を持っているかどうかは関係ありません) VistaはYMMVと異なる場合があります。

私は64ビットLinux上の64ビットJVMで-Xmx4000Mを試しましたが、それは問題ありませんでした。 私は6Gbの物理的なRAMを持っていたと考えて、それは大きな要求ではありませんでした。

あなたの80%のアイデアは面白いですが、私のテストシステムは悪影響を及ぼさないものよりも高いパーセンテージで動作します。 (あなたが何か他のことをやろうとしない限り)

もう1人のコメント作成者が正しいです、あなたのJVMのメモリ内イメージをページアウトするのは速くはありません。 後でJVMのほうがこれほど難しくありません(でも、より良いガベージコレクタがあります)。

メモリ消費量を減らすことはできません - それがどれほど難しいか分かっていれば、それの。

関連する問題