java1.4.2_08(b03)においてのプログラミング時、自身で書いたネイティブメソッド内でメモリリークが起きていて、不定期に落ちています。

メモリが原因だとしたら、メモリに関連したどのような動作で落ちるのでしょうか?
メモリが使用上限に達する事しか自分では思いつかなかったのですが
>JNI上でメモリリークが起きてると、JavaVMが、そのメモリを踏んだ瞬間に落ちる場合が多いです。
との解答も以前頂いています。

落ちる理由としての他のメモリ関連動作や、「リークしたメモリを踏んだ瞬間」周辺についてお教えいただきたいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:ohmix1 No.1

回答回数235ベストアンサー獲得回数14

ポイント50pt

過去の質問を見ると、ヒープとスタックをご存知ですね。

上記URLの解説を見るとメモリリークとは、

maloc()やnewした後でfree()やdeleteしていないことで、

これはヒープメモリのことです。

f_kennedy さんの認識はこちらのことですね。


http://www.ipa.go.jp/security/awareness/vendor/programming/b06_0...

6-1. バッファオーバーラン その1「こうして起こる」

バッファオーバーランと言う用語をよく聞くと思うのですが、

スタックメモリに関する障害はこれと同じようなことが起きています。

例えば以下のプログラムは環境によって動くかどうかは分かりません。


char * getstr()

{

  char str[10];

  strcpy(str, ”test”);

  return str;

}

int main(int argc, char* argv[])

{

  printf(”%s¥n”, getstr());

  return 0;

}


解説:

str[10]はスタックにありますが、getstr()を抜けた時点で開放されます。

開放された領域のポインタを使ってprintf()しているので動作は不明。

ただし、開放したスタックもクリアされてはいないので動く可能性は有ります。


以上

id:f_kennedy

ご解答ありがとうございます。

更なる情報求みます。

2006/02/16 23:02:34
id:noboru No.2

回答回数94ベストアンサー獲得回数0

ポイント20pt

http://blog.livedoor.jp/noboru2004/

NOBOLog - livedoor Blog(ブログ)

(URLはダミーです)


「落ちる」原因が必ずしも「メモリリーク」とは限りません。OSやライブラリによって動作は違うと思いますが、たとえば NULL ポインターにアクセスした場合(char *p; と宣言された p が NULL の状態で *p = 0; などとして書くとUNIX系OSでは停止して core dump します)とか、malloc()/free() で既にfree()したポインタに対して再度free()した場合にも落ちることがあります。


その他、0による割り算とかメモリ確保した領域以外へのアクセスした場合、またそれによりメモリ管理のためのポインタが入っている領域を破壊した場合(これは次回のメモリ確保または開放時に落ちるかも知れません)。自動変数にスタックを使っているコンパイラ(現在のメジャーなコンパイラはだいたいはそうです)で元の関数へリターンするためのアドレスが入っている領域を破壊した場合(この場合 return 後に落ちる可能性があります)。あとUNIX系OSの場合、他のプロセスからの SIGABRT などのシグナル受信により core dump して落ちることがあります。(SIGTERM などは core dump しませんが停止はします)。


ということで、もし落ちた時に UNIX 系 OS のように core dump するのであればデバッガで停止した位置とそのとき使用していた変数の値などを確認することをおすすめします。

id:f_kennedy

ご解答ありがとうございます。

2006/02/24 00:06:06
id:sqrt No.3

回答回数40ベストアンサー獲得回数0

ポイント130pt

>ネイティブコード内部でメモリリークが発生していると、

>JavaVMがガベージコレクションを実行したときに、異常終了する恐れがあります。

だそうです。このページにあるSystem.gc()を利用したデバッグは実際有用でした。

id:f_kennedy

ご解答ありがとうございます。

大変参考になりました。

2006/02/24 00:09:03
id:R1100GS97 No.4

回答回数28ベストアンサー獲得回数1

ポイント10pt

http://java.sun.com/j2se/1.4/ja/docs/ja/index.html

Java (TM) 2 SDK $B%I%-%e%a%s%H(J

URLはダミーです。

回答でなくて申し訳ないですが、まずどんなExceptionが発生しているのか、Exceptionが発生しているのがどういったコードなのか、といった情報があれば適切な回答ができると思います。例外をcatchしたところでprintStackTraceメソッドで表示させた内容を提示するのが早道と思います。

この質問の文章の範囲で答えると、メモリリークしているということはメモリの開放漏れを起こしている訳です。リークしたメモリというのはまだ開放されていない有効な領域ですから、そこを踏んだ (アクセスした) としても落ちたりはしません。メモリリークが原因で例外が発生するとしたら、メモリ不足例外でしょう。

id:f_kennedy

ご解答ありがとうございます。

発生例外やスタックトレースは以前の質問では質問に乗せていたのですが

JNI部分での問題は必ずしも例外やスタックトレースに現れないという解答や情報を得ましたので

乗せていません。

またネイティブメモリでのメモリリークはOOMとはならないと言う回答も頂いています。

2006/02/24 00:13:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません