アカウント名:
パスワード:
malloc/freeの処理コストってどれくらいかかるんだろう。メモリがバカ高かった時代はmalloc/freeで使用量を厳密に、というのはわかるんだが、ンGB当たり前の昨今、malloc/freeの処理コストの方が高くなったりしないのかな?と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。
・・・malloc/free叩いとらんな、最近。
>malloc/freeの処理コストの方が高くなったりしないのかな?>と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。
チマチマ何回かに分けて取るより一回にまとめて取った方が相対的に安くなるので、「だいたい、このくらい」でまとめて取ってから、それをアプリ内部でチマチマ切り刻んで使うというテクニックは昔からあったと思います。
そしてJVMなんかだと、それを自動でやってくれるので、Javaな人にとってはこれも「もうやらなくていい昔のコーディングテクニック」の一つですね。
それから、OSが仮想記憶をサポートして以降は、mallocは実メモリを確保するわけではなくOSの管理テーブルに予約するだけなので、ちょっとくらい大きい領域を予約しても影響はすごく小さくなってるはずです。
>そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)
いえいえ、お馬鹿なコードを書くとリークしていきますよ。使わなくなったオブジェクトに対する参照をつかんだままにしてればいくらでもメモリ使用量は増えていきますから。
スコープを外れた変数のつかんでるオブジェクトの回収とかは勝手にやってくれますが変数参照が生き残っていれば回収できないのです。プログラムグローバルなキャッシュを何も考えずに書かせると、そんなコードができるんじゃないですかね。ただ、まぁ、そうはいってもCに比べれば格段に問題のあるコードは書きにくくなっているでしょうね。
>>そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)>いえいえ、お馬鹿なコードを書くとリークしていきますよ。
「メモリリーク」という単語を、「ポインタ(或いは参照)を全て手放したにもかかわらず、領域の解放(free)を 忘れたために、メモリを少しずつ食い尽くしていく現象」と定義するなら、Javaだと「メモリリーク」の心配はほぼありません。#まさに「よほど変なことをしない限り」、且つ「VMやフレームワークにバグがない限り」。#C言語で長期間動作するアプリを作るのが難しいのは、このような「狭義の#メモリリーク」の検
御指摘の通り、長期運用を考慮していないという意味で問題だと思います。
ただ、Javaに限定した場合、最大メモリ使用量が予め設定されているので、(その範囲を超えないという意味で)OS側への影響は与えにくいですね。JVMで確保したメモリ内で段々と空き領域が減っていく・・・という話になります。
# 個人的にはOS上のメモリ使用量しか見てない運用者というのがいて、# JVM内のメモリ使用量を把握していない例が多いのが頭痛の種。(T-T
>運用者にとっては区別する意味が全くない。>この話を聞いて私が思い出す言葉は「五十歩百歩」です。プログラミングが分かってない人の意見かな。
運用者にとっては違わないかもしれないけど、開発者にとっては全然違いますよ。
狭義のメモリリークはデバッグが凄く難しい。それに比べ広義のメモリリークは対応が遥かに容易。
結果として、開発に同じだけのリソースを割り振った場合に、Cで作った場合は開発期間が長期化しメモリリークが多く不安定で、Javaで作った場合は短い開発期間でもメモリリークが少なく安定する、という違いとなって現れることが多い。
もちろん無限の開発コストと無限の開発期間がつぎ込める場合はこの限りではありません。
結果を区別する必要は無いけど、原因を区別する必要は有るね。
区別する気が無い人なら運用者にもならないで欲しい。なぜならその人は、バグったときにその区別ができるような情報をデバッグ者に渡す「気」が無いわけでしょ?
そういうところで情報断絶をおこしてデバッグが立ち往生すること、実際凄く多いんだよorzつまりそういう場合にバグがいつまでたっても直らないのはハッキリいってそいつのせい。
全く気にする必要が無い人はそれはエンドユーザというんだよ。運用者じゃない。
運用者は開発者とともに原因と結果の界面に居る人だ(でないと困る)。両方に目配りをしてもらいたい。
>>運用者にとっては区別する意味が全くない。>>この話を聞いて私が思い出す言葉は「五十歩百歩」です。>プログラミングが分かってない人の意見かな。
>運用者にとっては違わないかもしれないけど、開発者にとっては全然違いますよ。
>狭義のメモリリークはデバッグが凄く難しい。>それに比べ広義のメモリリークは対応が遥かに容易。
狭義/広義と使い分けているが、ただ単にスキル不足な気がする。昔ならいざ知らず、統合開発環境が主流な現在においてはどちらも容易。(ブレークポイント張りまくれるでしょ。スタックの中身ですら見えるでしょ。)プログラミングが分かってない人の意見かな。<
>昔ならいざ知らず、統合開発環境が主流な現在においてはどちらも容易。>(ブレークポイント張りまくれるでしょ。スタックの中身ですら見えるでしょ。)
ブレークポイントはどこで何が発生するか分かってないと張っても無駄です。
(狭義の)メモリリークの難しい点は、それを発生させる条件を特定することや、或いはそもそもメモリリークの有無を知ることそのものなんですよ。どういう条件の時にメモリリークが発生するのかまで特定できていれば、その部分のバグについては8割方片付いたも同じです。
ブレークポイントはその残りの2割のさらに一部を楽にできる程度の効果しかありません。#そもそも統合開発環境がある前からデバッガなんてありましたよ。#ブレークポイントをはったりもやってた。でも(狭義の)メモリリークは#最も面倒なバグの一つとして有名だったのです。
>出来ない君集団にやらせるなら、何使わせても一緒じゃね!?この部分についてだけは同意。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア
時々思うんだが (スコア:3, 興味深い)
malloc/freeの処理コストってどれくらいかかるんだろう。メモリがバカ高かった時代はmalloc/freeで使用量を厳密に、というのはわかるんだが、ンGB当たり前の昨今、malloc/freeの処理コストの方が高くなったりしないのかな?と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。
・・・malloc/free叩いとらんな、最近。
-- gonta --
"May Macintosh be with you"
Re: (スコア:2, 興味深い)
>malloc/freeの処理コストの方が高くなったりしないのかな?
>と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。
チマチマ何回かに分けて取るより一回にまとめて取った方が相対的に安くなる
ので、「だいたい、このくらい」でまとめて取ってから、それをアプリ内部で
チマチマ切り刻んで使うというテクニックは昔からあったと思います。
そしてJVMなんかだと、それを自動でやってくれるので、Javaな人にとっては
これも「もうやらなくていい昔のコーディングテクニック」の一つですね。
それから、OSが仮想記憶をサポートして以降は、mallocは実メモリを確保する
わけではなくOSの管理テーブルに予約するだけなので、ちょっとくらい大きい
領域を予約しても影響はすごく小さくなってるはずです。
Re: (スコア:0)
そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)でも起動時に1GByte以上のヒープサイズが必要ですとかいわれると、いくらメモリ安くなったとっていってもすこしひくなぁ。
Re: (スコア:1)
>そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)
いえいえ、お馬鹿なコードを書くとリークしていきますよ。
使わなくなったオブジェクトに対する参照をつかんだままにしてれば
いくらでもメモリ使用量は増えていきますから。
スコープを外れた変数のつかんでるオブジェクトの回収とかは勝手にやってくれますが
変数参照が生き残っていれば回収できないのです。
プログラムグローバルなキャッシュを何も考えずに書かせると、そんなコードができるんじゃないですかね。
ただ、まぁ、そうはいってもCに比べれば格段に問題のあるコードは書きにくくなっているでしょうね。
Re: (スコア:2, 参考になる)
>>そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)
>いえいえ、お馬鹿なコードを書くとリークしていきますよ。
「メモリリーク」という単語を、
「ポインタ(或いは参照)を全て手放したにもかかわらず、領域の解放(free)を
忘れたために、メモリを少しずつ食い尽くしていく現象」
と定義するなら、Javaだと「メモリリーク」の心配はほぼありません。
#まさに「よほど変なことをしない限り」、且つ「VMやフレームワークにバグがない限り」。
#C言語で長期間動作するアプリを作るのが難しいのは、このような「狭義の
#メモリリーク」の検
Re:時々思うんだが (スコア:3, 参考になる)
言葉の定義がどうであろうと起きている現象がなんであろうと
問題ですね。
このメモリリークの広義/狭義(あるいはメモリリーク/メモリリテンション)って
のは良く聞く話なのだけど運用者にとっては区別する意味が全くない。
この話を聞いて私が思い出す言葉は「五十歩百歩」です。
Re:時々思うんだが (スコア:1)
御指摘の通り、長期運用を考慮していないという意味で問題だと思います。
ただ、Javaに限定した場合、最大メモリ使用量が予め設定されているので、
(その範囲を超えないという意味で)OS側への影響は与えにくいですね。
JVMで確保したメモリ内で段々と空き領域が減っていく・・・という話になります。
# 個人的にはOS上のメモリ使用量しか見てない運用者というのがいて、
# JVM内のメモリ使用量を把握していない例が多いのが頭痛の種。(T-T
Re:時々思うんだが (スコア:1)
>運用者にとっては区別する意味が全くない。
>この話を聞いて私が思い出す言葉は「五十歩百歩」です。
プログラミングが分かってない人の意見かな。
運用者にとっては違わないかもしれないけど、開発者にとっては全然違いますよ。
狭義のメモリリークはデバッグが凄く難しい。
それに比べ広義のメモリリークは対応が遥かに容易。
結果として、開発に同じだけのリソースを割り振った場合に、
Cで作った場合は開発期間が長期化しメモリリークが多く不安定で、
Javaで作った場合は短い開発期間でもメモリリークが少なく安定する、
という違いとなって現れることが多い。
もちろん無限の開発コストと無限の開発期間がつぎ込める場合はこの限りではありません。
Re: (スコア:0)
結果を区別する必要は無いけど、
原因を区別する必要は有るね。
区別する気が無い人なら運用者にもならないで欲しい。
なぜならその人は、バグったときにその区別ができるような情報をデバッグ者に渡す「気」が無いわけでしょ?
そういうところで情報断絶をおこしてデバッグが立ち往生すること、実際凄く多いんだよorz
つまりそういう場合にバグがいつまでたっても直らないのはハッキリいってそいつのせい。
全く気にする必要が無い人はそれはエンドユーザというんだよ。運用者じゃない。
運用者は開発者とともに
原因と結果の界面に居る人だ(でないと困る)。両方に目配りをしてもらいたい。
Re: (スコア:0, フレームのもと)
>>運用者にとっては区別する意味が全くない。
>>この話を聞いて私が思い出す言葉は「五十歩百歩」です。
>プログラミングが分かってない人の意見かな。
>運用者にとっては違わないかもしれないけど、開発者にとっては全然違いますよ。
>狭義のメモリリークはデバッグが凄く難しい。
>それに比べ広義のメモリリークは対応が遥かに容易。
狭義/広義と使い分けているが、ただ単にスキル不足な気がする。
昔ならいざ知らず、統合開発環境が主流な現在においてはどちらも容易。
(ブレークポイント張りまくれるでしょ。スタックの中身ですら見えるでしょ。)
プログラミングが分かってない人の意見かな。<
Re:時々思うんだが (スコア:3, 参考になる)
>昔ならいざ知らず、統合開発環境が主流な現在においてはどちらも容易。
>(ブレークポイント張りまくれるでしょ。スタックの中身ですら見えるでしょ。)
ブレークポイントはどこで何が発生するか分かってないと張っても無駄です。
(狭義の)メモリリークの難しい点は、それを発生させる条件を特定することや、
或いはそもそもメモリリークの有無を知ることそのものなんですよ。どういう
条件の時にメモリリークが発生するのかまで特定できていれば、その部分のバグに
ついては8割方片付いたも同じです。
ブレークポイントはその残りの2割のさらに一部を楽にできる程度の効果しかありません。
#そもそも統合開発環境がある前からデバッガなんてありましたよ。
#ブレークポイントをはったりもやってた。でも(狭義の)メモリリークは
#最も面倒なバグの一つとして有名だったのです。
>出来ない君集団にやらせるなら、何使わせても一緒じゃね!?
この部分についてだけは同意。