2017-03-25 24 views
1

私はネイティブライブラリを使用するJavaプロセスを持っています。このネイティブライブラリはかなりリソースが重く、多くのRAMを消費します。さらに、いくつかのコーナーケースについては、それは完全に私の記憶をすべて取り、私のシステムを完全に凍結します。JNIとサブプロセスメモリの上限を設定する

アプリケーションがこれらの奇妙なコーナーケースでちょうどクラッシュした場合は、いいでしょう。しかし、例外がスローされる可能性がある場合、それはさらに良いでしょう。このJNIライブラリへの呼び出しとサブプロセスの実行にメモリ制限を指定する方法はありますか?

私はLinuxでulimit -vを試してみましたが、うまくいきませんでした。理想的には、プログラムは他のプラットフォームでも動作する必要があるので、私はよりポータブルなソリューションを望んでいます。

+0

私が知っている本当の解決策はありません。もしもこのライブラリがどのように機能しているのか分かっていれば、何とかそのメモリの使い方に介入して失敗を 'malloc()'呼び出しに返すことができます。しかし、あなたの動作の説明から、このライブラリは扱いにくいでしょうこのような障害はうまく戻ってしまい、結果的にクラッシュやデータの破損を招くことになります。移植可能なクロスプラットフォームソリューションはさらに難しくなります。 IMOはJVMをLD_PRELOADまたはDLLインジェクションと一緒に介入させ、同時に火災とガソリンを使ってプレイしています。不正な第三者図書館が反物質を追加します。 –

答えて

1

確かにポータブルな解決策はありません。現在のプロセスと子プロセスによるリソース使用を制限することは、OSによってのみ可能です。そのため、プラットフォーム固有でポータブルではありません。

あなたはulimitを試しましたが、これはうまくいきません。 (制限はプロセスごとにあるためだと思います)もう一つの選択肢はLinux Control Groups(cgroups)です。

いずれにしても、ulimitcgroupsは移植性がなく、JVMの外部で設定または管理しています。

+0

*現在のプロセスと子プロセスのリソース使用を制限することは、OSだけが行うことができます。*これはプロセス全体にわたるものです。プロセスにリンクされている*ライブラリによるリソース使用を制限する方法はわかりません。 –

+0

私は "現在のプロセスによって..."を意味しました。ネイティブライブラリがプロセス内でできることを制限する方法はありません。 –

+0

いいえ* easy * way。上記の私のコメントで触れたように、 'malloc()'のようなメモリ管理関数を介在させ、呼び出し元を特定し、ライブラリのメモリ使用をそのように制限することができます。しかし、それはひどいハックです.Javaプロセスに介入することは、まず危険に苦しんでいます。そして、これはまた、指定された制限にヒットしたときに、 'malloc()'が 'NULL'を返す場合、ライブラリが正常に動作していると仮定します。 –

0

JNIライブラリはJVMプロセスにロードされるため、JNIパーツにのみ特別なメモリ制限を適用することはできません。 2番目のプロセスだけを作成することは可能ですが、それはメインのJavaプロセスとJNIの部分をヒントする2番目のプロセス間のプロセス間通信が必要になります。

しかし、メモリ使用量を制限することはOSの仕事なので、プラットフォームに依存しないソリューションはありません。

これを解決するには、ライブラリのソースを変更するだけでいいのです(うまくいけば、私たちはオープンソースライブラリについて話していますか?)、または使用しているライブラリをメモリ使用を制限する方法で設定します)。

関連する問題