teratail header banner
teratail header banner
質問するログイン新規登録
JVM

JVM(Java Virtual Machine)があれば、一連のコンピューターソフトウェアプログラムとデータストラクチャが、仮想マシンモデルを使って他のコンピュータプログラムやスクリプトを拡張できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Q&A

解決済

1回答

651閲覧

JVMとメモリリーク

20200812_javaer

総合スコア11

JVM

JVM(Java Virtual Machine)があれば、一連のコンピューターソフトウェアプログラムとデータストラクチャが、仮想マシンモデルを使って他のコンピュータプログラムやスクリプトを拡張できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

0グッド

0クリップ

投稿2022/07/04 00:47

0

0

JVMとメモリリークの関係について

javaのソース内で、
Runtime.getRuntime().totalMemory()
Runtime.getRuntime().maxMemory()
をログに出力して監視しています。

通常であれば、
totalMemory = JVMの起動オプションで設定したXms
maxMemory = JVMの起動オプションで設定したXmx
と認識しております。

実際には処理の途中で、
totalMemory の値が、JVMの起動オプションで設定したXmsを下回ることがあります。

これは、メモリリークが発生する可能性がありますか?

それとも、メモリリークが発生する可能性があるのは、
maxMemory の値が、JVMの起動オプションで設定したXmxを上回る場合でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

それとも、メモリリークが発生する可能性があるのは、maxMemory の値が、JVMの起動オプションで設定したXmxを上回る場合でしょうか?

メモリリークが発生する可能性があるのは、メモリリークが発生する可能性のあるプログラムを実行したとき。起動時オプションの指定とは無関係。

メモリリークが発生するプログラムを実行したとき、は起動時オプションが関係する。メモリリークが発生していても、起動時オプションで指定した範囲で収まってしまう場合にはプログラムは正常終了できる。かもしれない。起動時オプションで指定した範囲に収まらない場合にはOutOfMemoryErrorなどが発生する。かもしれない。

投稿2022/07/04 01:40

shiketa

総合スコア4133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

20200812_javaer

2022/07/04 02:20

shiketa様 ご回答頂きまして、誠にありがとうございます。 追加で質問させて頂きます。 1)メモリ消費量 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() 2)このメモリ消費量が Xms ~ Xmxに収まっていれば、OutOfMemoryError が発生する可能性は低い、と認識しております。 この認識で、正しいでしょうか? (ちなみに、javaのVerは1.8です) さらに、もう1点質問させて頂きますと、 「totalMemory の値が、JVMの起動オプションで設定したXmsを下回る」事象の、リスクはありますでしょうか? ユーザ様の見解は、以下の通りです。 1)Xmsを下回っているので、メモリリークが発生している 2)Xmsを下回っているので、今後 OutOfMemoryError が発生する 私の見解は、以下の通りです。 1)メモリ消費量をグラフ化できるツールで確認した結果、メモリの解放がされているので、メモリリークは発生していない 2)メモリ消費量が Xmx を超える場合に、今後 OutOfMemoryError が発生する可能性がある これらの見解について、コメント頂きますと幸甚です。 勉強不足で申し訳ございません。 今後は、起動オプションでXms・Xmxを変更し、メモリ消費量をグラフ化できるツールで実際のメモリの動きを確認し、 理解を深めたいと考えております。
shiketa

2022/07/04 03:35

無責任な反応をしておきます。 ユーザが「メモリリークは一切許容できない」というのであれば、「メモリリークは発生していない」ということを力を尽くして説得すれば良いのではないでしょうか。 あなたが「メモリリークは発生しているかもしれないけれど、要件は満たしているので問題ない」と考えているのであれば、それで理解を得ればいい。 どんなアプリケーションなのか、にもよるでしょうか。 コマンドラインアプリケーションで、1000万件処理する必要がある。1000万件処理できるのだからそれでいい。 サーバサイドアプリケーションで、10年間無停止で動作すること、が要件なのであればちょっとしたメモリリークも許されない。塵も積もれば山となる、ので。 わたしがメモリリークを疑ったときは、https://www.google.com/search?q=jconsole を使って目星をつけた記憶があります。どのグラフをみ、どの数値をみ、どんな現象をみていたのかは忘れました。が、 Runtime.getRuntime().totalMemory() freeMemory() を眺めていただけでないことは、たしかです。
20200812_javaer

2022/07/05 06:40

shiketa様 追加質問にもご回答頂きまして、誠にありがとうございます。 ユーザ様と協議してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問