[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10823] メモリ管理



村山@netgeneです.

JavaVMとOSのメモリ管理について,あの時言ってたことは大ボケ
ですね.freeにするのがあまり意味がないってのは間違ってませんが,
それ以上はマヌケもいいところ.

最近は組込み分野にいたもので,MMUも論理アドレスも仮想記憶も
頭の中から抜け落ちてました.(^^;

ちょっと考えてみましたが,多分次のような感じだになってるん
じゃないかと思います.

--------------------
○MMUも仮想記憶も無い場合.
基本的にメモリ保護もない.その場合はmalloc/freeも
たいしたことはできない.へたするとmalloc/freeがない.

もし保護を可能とするならば,free()にしたからと言っても
そのメモリが本当に使われないという保証はないので,
freeにした部分もそのプロセスが終了するまでは他の
プロセスに渡すことはできない.
#メモリリークの逆.まだ使ってるのにfreeしてしまい,
#他のアプリが使ってる所に書き込んだりする.
#前回,目を開けてほざいてた寝言はこのこと.

大昔のMS-DOSやWindows3.1の頃ならば似たようなものだったかも
しれませんが,今や時代錯誤もいい所.
#大昔のLion Bookの頃なら,ひょっとしたら
#そーゆー感じだったかも...
##Linuxの初期の頃はどうだったんでしょう?

----
○仮想記憶がある場合.
#今は100%こっち.
#違うとすればJavaVM内部くらいか.

・論理アドレス空間の問題と物理アドレス空間の
二つの視点から考える必要がある.

プログラム側から見える実行モデルそのものは昔のものを
引きずっているかも知れないが,それは完全にモデル上の
ものであり,それ以上の意味はない.

・物理アドレスについては,時々刻々と変化するので計測できたと
しても,計測結果にはさほど意味がない.あるプロセスがメモリを
多く使っていたとしても,次の瞬間にはスワップアウトされたり
する.


・各プロセスの論理アドレスの問題については,単に数字の上での
問題なので,多くても少なくてもほとんど意味がない.
#一応制限はかけてあるとは思う.limitなんてコマンドも
#あったと思うし.なによりプログラミングスタイルとして
#勧められたもんじゃない.

メモリをmallocしてもそれは数字の上の話で,テーブルに「これ
だけのサイズの領域を使う予定なので前もって予約」と記録する
だけ.この時点ではそれ以上の意味はない.
#預金通帳に「10億円入金(予定)」と書くようなもの.その時点
#では単にプリンタで書き込むだけなので,金額が1円だろうと
#10億円だろうと10兆円だろうと,さして手間は変わらない.
#たとえその場に現金がなかったとしてもなんら問題にならない.
#10億円の札束が必要になるのは本当に10億円を引き出した
#ときのみ.
##通帳というよりは約束手形に近いのかな?

freeにしても同様で,予約した領域を減らすのみ.


・このような論理アドレスは各プロセスごとに独立しており,その
大きさは(物理メモリに比べて)事実上無限とも言えるほど大きい
ので,「予約している」領域の大小はまず問題にならない.
#通帳に「百億円」と書こうが「一兆円」と書こうが,ただ書く
#だけなら害はない.

問題となるのは「実際に使用している」領域.特にワーキングセット
の方.これが実際に使用できる物理メモリに比べて大きい場合は,
スワップが頻発して性能ががた落ちになる.
#当然だが「予約している領域」の方が「実際に使用している領域」
#より大きくなる.
##はず.ただOSの世界は驚くような技術もあるからなあ....

だからJavaVMが「実際に使用している領域」が同じである限り,
「予約している領域」が10MBだろうと50MBだろうと,それ自体は
さほど問題にならない.freeで返却した分についてもそれが
「予約している(論理的な)領域」から実際に減っても減ら
なくても,それ自体はさほど問題にならない.(と思う.)

#仮想記憶の実装は各OSごとに多少の差異はあるとは思うが,その
#基本となる技術は同じなので,概ね似たようなものになるでしょう.

-----
というところでは.

要は見かけ上の「予約している領域」に拘るのはまず無意味で,
重要なのは「実際に使っている領域」を減らすことの方.まあ,
わざわざ不要と分かっている領域までmalloc()しない方が
良いとは思いますが,多少多くmalloc()したり,free()が遅れた
からと言って,即問題になることは少ないと思います.

#Javaで言えば,「GCで実際に解放されたかどうか」に拘るのは
#無意味で,重要なのは「生きているオブジェクト」を減らす
#ことである,というようなものか.


とすると,JavaVM実装においても,

free()で返しても,それが反映されるようになってるかどうか
分からないし,返す必要性も少ない.だからJavaVMでも無理に
返却するように作ってるとは限らない.たとえ返却してても,
それがtopコマンド等で観測できるとも限らない.

また,例えばある瞬間に50MBのメモリを必要としたのならば,
その後特に実行条件が大きく変化しない限り,またいずれ50MBの
メモリが必要になる可能性は高い.となれば,一度増えたメモリを
無理に返却しないように実装していても不思議はない,

と思います.


-----------------
#さらに余談

#生活習慣病に関しては,ちくま新書より出てる次の本がお勧め.
#「生活習慣病を防ぐ7つの秘訣」「生活習慣病」
#「糖尿病の話」,いずれも田上 幹樹著.
#なんせ「ケトン体性昏睡」まで載っている.
#http://www.amazon.co.jp/exec/obidos/search-handle-url/index=books-jp&field-author=%E5%B9%B9%E6%A8%B9%2C%20%E7%94%B0%E4%B8%8A/250-7401995-5435412

#こういうことに詳しくても,全く自慢になりません.(^^;

-- 
村山敏清 株式会社ネットジーン 〒164-0001 
東京都中野区中野3-33-3 インツ中野ビル 5F
E-mail:murayama@xxxxxxxxxxxxx 
TEL:(03)5328-3670 FAX:(03)5328-3673
http://www.netgene.co.jp/