[delphi-users:2980] ガーベッジコレクションについてどうお考えですか

588 views
Skip to first unread message

ek

unread,
Feb 1, 2013, 11:51:27 PM2/1/13
to delphi...@freeml.com
ekです。
ガーベッジコレクション(以下GC)はJavaが採用して大流行りになったメモリ管理技術ですが、我々Delphiプログラマにとっては「なんでそんなものが要るの?」ですよね。最近はGCの高速化もかなり実現しているようですが、リアルタイム性の高いシステムをJavaで書く時はGCのオーバーヘッドにたいへん気を使う必要があり、精神衛生によくないのではないでしょうか。
今、まつもとゆきひろ氏の「コードの未来」という本を読んでいますが、GCについて以下のように書いています。
1.「もう使わない」つもりでOSに返してしまった領域にうっかりアクセスすると・・・
→ 破棄したインスタンスへのポインタにはnilを入れておく。必要なら、またcreateする。プログラマの常識。
2.使い終わっても返却を忘れていると・・・・
→ プログラムが(正常)終了する時に全部破棄されるのをDelphiが保証しています。しょっちゅう異常終了するようなプログラムなら、バグつぶしが先。
3.結局、大量に割り当てたメモリー領域を人間がきちんと管理するのは非常に困難であるということです
→ Delphiを使えば何の問題もなし。

ということで、私は世間がGC、GCと騒ぐのが昔から理解できないのですが、皆さんはどうお考えですか。





MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=j1xjy
------------------------------------------------------[freeml byGMO]--

c-yan

unread,
Feb 2, 2013, 2:00:58 AM2/2/13
to delphi...@freeml.com
c-yan です.

> リアルタイム性の高いシステムをJavaで書く時はGCのオーバーヘッドにたいへん気を使う必要があり

そもそも、ハードリアルタイムのシステムも、ソフトリアルタイムのシステムもほとんどのプログラマは書きません.
リアルタイム性の高いシステムを書く際に Java を選ぶのがおかしいのです.
道具の使い分けが出来て無いだけだと思います.
誰も GC のあるプログラミング言語が全領域で優位だとは言っていないと思います.
(最近はゲームですらC言語+Luaみたいな折衷案が増えてますね)

Java の Web サービスだと、Minor GC は 1GB で1秒未満、Full GC で数十秒かかったりしますが、それは HTTP リクエスト1つにつき、
1スレッド割り当ててオブジェクトを作りまくる、小さなオブジェクトが多数作られる GC に最悪な環境だからであって、
デスクトップアプリだと GC に気付くことはよほどなことがなければありません.
よほどな時はそこだけ考慮してあげればたいていのアプリケーションは何とかなります.
C# なら、そこだけC言語で DLL を作ってコールすることも容易です. (と前は言っていたけど、最近は 32bit/64bit 混在なのでちょっとアレ)

> 2.使い終わっても返却を忘れていると・・・・
> → プログラムが(正常)終了する時に全部破棄されるのをDelphiが保証しています。しょっちゅう異常終了するようなプログラムなら、バグつぶしが先。

サービスは数ヶ月とか、年オーダーで走り続けるのですが・・・.

> 1.「もう使わない」つもりでOSに返してしまった領域にうっかりアクセスすると・・・
> → 破棄したインスタンスへのポインタにはnilを入れておく。必要なら、またcreateする。プログラマの常識。
> 3.結局、大量に割り当てたメモリー領域を人間がきちんと管理するのは非常に困難であるということです
> → Delphiを使えば何の問題もなし。

結局のところ、コンピュータにやらせられることを人間でやるのは、
コンピュータに使われてることになるけど嬉しいのか?と思います. (計算機がなくてもそろばんで計算できるからいいと言い張る人を見るような気分に)
書けることと楽なことは別です.

Delphi に GC をつけた互換性の無い言語が欲しいかといわれると賛否両論かもしれませんが
GC なんかいらないよねといわれると、新しいものに対応できなくなったロートルとしか思えません.

と言っても、自分も昔に同じようなことを思っていたころもあるのであまり人のことは言えません.
GC のある言語をバリバリ使ったことが無い人は、GC がそもそもなくても簡単にかける範囲のことしか考えれなくて、
そもそも GC を前提にした、ごみを大量にばら撒く引き換えに生産性が高いコードを想像することが出来ないのです.

// CSV の最後の3行の、1番目と3番目の値を CSV として出力
File.open('hoge.csv') { |f|
puts f.read # ファイルを最後まで読んで
.split("\n") # \n で分割して
.reverse # 逆順にして
.take(3) # 先頭の3行を取って (= 最後の3行)
.reverse # 逆順にして (順序を元に戻す)
.map{|e| e.chomp } # \r を削除して
.map{|e| e.split(",") } # CSV の行を値の配列にして
.map{|e| [e[0], e[2]] } # 1番目と3番目の値をとって
.map{|e| e.join(",")} # CSV の行に戻して
.join("\n") # 行ごとに改行をつけて
}

わざとらしく処理を小さく分割していますが、小さいほうがメンテナンス性は高いです.
(分かりやすいし(=直しやすい)、順序を変えたり、部分的に外したりしやすい、インクりメンタルに開発がしやすい)

上みたいなコードを、いちいち変数に入れて、開放してとかやっていたら
いらいらしてきます.
正直やってられません.

一度 C# の LINQ (ただしメソッド構文で書くこと)で、生産性の高い GC のある環境にどっぷり浸って見てはいかがでしょうか.
Delphi を作った Anders Hejlsberg が開発している言語です.
コンパイルも速いです.
こんな感じ↓

// 21世紀に生まれた人の中で、一番年をとっている5人
persons.Where(e => e.Birthday >= new DateTime(2001, 1, 1))
.OrderByDescending(e => e.Birthday)
.Take(5)
.ToArray();

(persons が DB のテーブルでも、person の配列でも、person の List でも同じように動きます)

井の中の蛙は大海を知らないのです.

以上です.

# Delphi を新規で使うのは、相手の PC に .NET Framework が入っているか考えなくていいとか、そういう理由くらいしかもう思いつかない・・・

> ekです。
> ガーベッジコレクション(以下GC)はJavaが採用して大流行りになったメモリ管理技術ですが、我々Delphiプログラマにとっては「なんでそんなものが要るの?」ですよね。最近はGCの高速化もかなり実現しているようですが、リアルタイム性の高いシステムをJavaで書く時はGCのオーバーヘッドにたいへん気を使う必要があり、精神衛生によくないのではないでしょうか。
> 今、まつもとゆきひろ氏の「コードの未来」という本を読んでいますが、GCについて以下のように書いています。
> 1.「もう使わない」つもりでOSに返してしまった領域にうっかりアクセスすると・・・
> → 破棄したインスタンスへのポインタにはnilを入れておく。必要なら、またcreateする。プログラマの常識。
> 2.使い終わっても返却を忘れていると・・・・
> → プログラムが(正常)終了する時に全部破棄されるのをDelphiが保証しています。しょっちゅう異常終了するようなプログラムなら、バグつぶしが先。
> 3.結局、大量に割り当てたメモリー領域を人間がきちんと管理するのは非常に困難であるということです
> → Delphiを使えば何の問題もなし。
>
> ということで、私は世間がGC、GCと騒ぐのが昔から理解できないのですが、皆さんはどうお考えですか。

--
c-yan
http://www.cyanet.jp/


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日豪華プレゼントキャンペーン開催中!くまポン
http://ad.freeml.com/cgi-bin/sa.cgi?id=j1y2P
------------------------------------------------------[freeml byGMO]--

ek

unread,
Feb 2, 2013, 8:17:42 AM2/2/13
to delphi...@freeml.com
c-yanさん、ekです。ご意見ありがとうございます。

>リアルタイム性の高いシステムを書く際に Java を選ぶのがおかしいのです.

あらゆるWebシステムは「リアルタイム性が高い」ので、「Webシステムを書く際に Java を選ぶのがおかしい」言われているような気が・・・。

>誰も GC のあるプログラミング言語が全領域で優位だとは言っていないと思います.

c-yanさんは言わないでしょうが、「近頃の若者」ではGCのない言語を化石のように考えている人は多いのではないでしょうか。そんなことがないなら幸いですが、まつもとゆきひろさんでさえ、「GCは必須教」を広めています。

>Java の Web サービスだと、Minor GC は 1GB で1秒未満

はい。この辺りは進歩したなぁと思います。

>サービスは数ヶ月とか、年オーダーで走り続けるのですが・・・.

だから、しっかりデバッグしないと・・・ ...^ ^);。

>結局のところ、コンピュータにやらせられることを人間でやるのは、

この辺りの考えの違いは大きそうですね。
私は「お行儀のよいプログラム」を書くのは『嗜み』であると思うので、「コンピュータに使われてる」などまったく感じません。
変数宣言不要という仕様の言語も好きになれません。変数宣言をしておけばコンパイラが綴りの間違いをチェックしてくれるのはかえって生産性を高めると思います。動的データ型は、意識してvariantを使えばよいし。

>上みたいなコードを、いちいち変数に入れて、開放してとかやっていたら
 いらいらしてきます.

多分私は喜々、として「try・・・finally」を書きます(現に、喜々として書いていると思います)。

>こんな感じ↓
 // 21世紀に生まれた人の中で、一番年をとっている5人

ろくでもないSQLはいい加減に廃止して、これに変えたらよさそうですね。
しかしこれはGCのありなしとは関係ない話のように思います。

ん~~、例えば、ローカルな変数をポインタに使っているなら、その変数のスコープから出る時にインスタンスを破棄する、という仕様はごく自然だと思います。
保持しておきたいインスタンスならグローバル変数にするとかstaticキーワードを付けるとか。

>井の中の蛙は大海を知らないのです.

あ、それは自覚しているので、皆さんから教えていただきたいと思いまして。
で、どうもいまひとつ納得がいきません。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
いつでもどこでもメールチェック!freemlのスマートフォンアプリ
http://ad.freeml.com/cgi-bin/sa.cgi?id=j12ZG
------------------------------------------------------[freeml byGMO]--

c-yan

unread,
Feb 2, 2013, 9:07:07 AM2/2/13
to delphi...@freeml.com
ek さん

c-yan です.

> >リアルタイム性の高いシステムを書く際に Java を選ぶのがおかしいのです.
>
> あらゆるWebシステムは「リアルタイム性が高い」ので、「Webシステムを書く際に Java を選ぶのがおかしい」言われているような気が・・・。

Web は一般に言われるリアルタイムと違うと思います.
Web なんぞ3秒ルールとかあるくらいで全然リアルタイムじゃありません.
オンライン vs バッチ のオンラインとか、同期 vs 非同期の同期程度の意味で使われていませんか?
リアルタイムシステムって言ったら何ミリ秒以内に必ず応答しなければいけないとか、そういった類だと思いますが.
ゲームだと1フレームの16.6ミリ秒以内とか.

> >サービスは数ヶ月とか、年オーダーで走り続けるのですが・・・.
>
> だから、しっかりデバッグしないと・・・ ...^ ^);。

しっかりデバッグしたら、バグが無くなるんだったら誰も苦労してませんし、
コストパフォーマンスが見合いません.
道楽で書いているんだったら気にしなくてもいいのかもしれませんが.

ek さんはバグを全く出さないんですか?
すごいですね.

> >結局のところ、コンピュータにやらせられることを人間でやるのは、
>
> この辺りの考えの違いは大きそうですね。
> 私は「お行儀のよいプログラム」を書くのは『嗜み』であると思うので、「コンピュータに使われてる」などまったく感じません。

私は怠慢、短気、傲慢こそプログラマの嗜みだと思いますけどね.

> 変数宣言不要という仕様の言語も好きになれません。変数宣言をしておけばコンパイラが綴りの間違いをチェックしてくれるのはかえって生産性を高めると思います。動的データ型は、意識してvariantを使えばよいし。

Java も C# も変数宣言します.
GC と変数宣言は関係ないです.
Matz の話で振ってきたので、普段 Python を書いてるのに、わざわざ Ruby を持ち出したんですが.
# まあ、Python も変数宣言は無いですが

自分も使い捨てでないコードの変数は宣言したい派です.
JavaScript とか、Perl は GC のあるインタプリタ言語ですが、
未宣言変数が使えない strict モードとかを持っていたりしますね.

関数型言語にいたっては変数の存在自体がお行儀が悪く、基本的に定数ですね.
お行儀のよいプログラムとは、一意に決まるものでは無いでしょう.

> >上みたいなコードを、いちいち変数に入れて、開放してとかやっていたら
>  いらいらしてきます.
>
> 多分私は喜々、として「try・・・finally」を書きます(現に、喜々として書いていると思います)。

少数派だと思われます.
何かを実現したくてコードを書いてるのであって、メモリを開放するためにコードを書いているんじゃないと思うんですけどね.

> >こんな感じ↓
>  // 21世紀に生まれた人の中で、一番年をとっている5人
>
> ろくでもないSQLはいい加減に廃止して、これに変えたらよさそうですね。
> しかしこれはGCのありなしとは関係ない話のように思います。

単に C# も ruby のように書けることを言いたかっただけです.
GC がなかったら

DateTime year2011 = null;
try {
year2011 = new DateTime(2001, 1, 1);
Person[] t1 = persons.Where(e => e.Birthday >= year2011);
} finally {
if (year2011 != null) year2011.Free();
persons.Free();
return false;
}

try {
Person[] t2 = t1.OrderByDescending(e => e.Birthday);
} finally {
t1.Free();
return false;
}

try {
Result = t2.Take(5);
} finally {
t2.Free();
return false;
}

とかになりますかね.
うわー、何も価値が増えてないのに書く量が6倍に増えてるなあ(棒読)
あ、適当に書きすぎて例外が上に伝播して無い・・・.
価値下がってる.

> ん~~、例えば、ローカルな変数をポインタに使っているなら、その変数のスコープから出る時にインスタンスを破棄する、という仕様はごく自然だと思います。
> 保持しておきたいインスタンスならグローバル変数にするとかstaticキーワードを付けるとか。

C言語とか Delphi にない仕様を言われても.
C++ はスマートポインタでいける気がしますが、指定制なのでちょっと違いますね.
で、誰も作ろうとしない言語仕様が自然とはこれいかに.
グローバル変数はそもそも使いたくないですし・・・.

前のメールを書いた後に気付いたんですが、
「プログラムが(正常)終了する時に全部破棄されるのをDelphiが保証しています。」
は、Delphi じゃなくて Windows (OS) だと思います.

ちなみに、プロセス終了時のメモリ開放は無理にすると、状況によってはエラーを引き起こすので
OS に任せて、しないほうがいいと、Microsoft の人が言ってます.
http://blogs.msdn.com/b/oldnewthing/archive/2007/05/03/2383346.aspx?Redirected=true

そういえば、忘れていましたけど、Delphi の文字列とか動的配列で使われている
参照カウントも広義の GC ですね.
Python はメインは参照カウントです.
循環参照対策用に通常のGCも備えていますが.

以上です.

--
c-yan
http://www.cyanet.jp/


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
かわいいベジモンがたくさん!自分だけの農場を作ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=j13Ac
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Feb 2, 2013, 9:08:45 AM2/2/13
to delphi...@freeml.com
こんばんは。
細川です。

GC については、時と場合によるでしょう。
通常の環境で動くプログラムは、GC があっても良いと思います(あったほうが
良いくらい)。
選べれば最高ですね( managed, unmanaged code)。

ただ、1つ指摘しておきたいのは、リアルタイム性のある処理に Java を使わざ
るを得ない、そういう環境もあります。
いうまでもなく、Android です。
Android は(いわゆるPCと比べ)貧弱なハードです。
そこで、開発言語として Java を選んだのは狂気としかいいようがありません。
通常の高速化のテクニックとして、メモリを一括で取得後、ポインタの書き換え
だけでデータの更新をしていくとか、そういった処理が全くできないためです。
遅いから高速化したいのに、それが出来ないのです。
(もちろん NDK を使えば、ネイティブで作れますが、現状では処理を so に逃
がすのが主で、NativeActivitiy を使っているシステムはあまりないのではない
でしょうか?)

こういったモバイルシステムでは、iOS のように、ネイティブコードと、
ARC(Automatic Reference Counting) のようなメモリ管理が良いと思っています。

ですので、Delphi for Android が出るのが楽しみでなりません。
(Delphi for Android はネイティブコードで Android アプリが作れる)

--
HOSOKAWA Jun <j...@serialgames.co.jp>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
アイテムたくさん☆freemlのプロフィール画像をアバターに♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=j13Bb
------------------------------------------------------[freeml byGMO]--

Delフサギコ

unread,
Feb 2, 2013, 9:38:38 AM2/2/13
to DelphiML
こんにちは。
ホンモノの方のDelフサです。(twitterやってるのはネガティブ偽者w)

あまり詳しいわけではないですが私はGC欲しい派です。

VB.NETでとあるシステムを組んだ時に
何百枚かの画像ファイルが1セットとして
1つの3Dモデルを構築するものを見るビューワーを作る仕事をしてまして

場合によってはその3D画像が4画面とか9画面とかの分割状態で起動する場面があり、

4画面だと、画面が起動している際に、4スレッドがそれぞれ数百枚の画像を読みにいき
その画像の中に不具合のある画像が紛れ込んでいる場合、
ダイアログを開かせて、1セット何百枚かの画像をツリービューに表示させ
条件に適合しない画像ファイルを排除するという機能になっており

ダイアログが表示されている間も他の画面では画像を読込させつづけ、
やはり条件に合わない場合はダイアログが表示される、
というものでした。

苦労しつつ、スレッドで処理を回しながらオブジェクトを生成したりいろいろやったのですが
正直、GCがないと組むのは辛かったです。


他の仕事でも、
一つのデータを、複数の画面から同時にいろんな視点で見る必要がある
プログラムを組んでいた際には、
データ管理用のリストを持ちつつ、画面はそこへのポインタで見ている実装をしたことがありますが
見ている画面がすべて閉じられたらデータは不要なので破棄するのですが
GCがないからいろいろ通知する必要があって、苦しい実装になってしまいました。


どっちの仕事も、伝えるのが難しいので
外野なら「なくても上手に作れるだろ」って思うネタだと思いますが。
あったら便利。ってのを非常に感じましたよ。


GCはいると思います。
今後は必須だと思うので、DelphiはさっさとGC実装して
順当に進化して欲しいものです。



> GC のある言語をバリバリ使ったことが無い人は、
> GC がそもそもなくても簡単にかける範囲のことしか考えれなくて、
> そもそも GC を前提にした、ごみを大量にばら撒く引き換えに
> 生産性が高いコードを想像することが出来ないのです.

そう思います。

GCがなくても書ける範囲でしか物をあまり考えられない私でも
もっとGC依存した短いコードで成すべき事を成せるように思考できるように
なりたいもんだと思います。

--
Delフサギコ  ミ・д・彡 <delfu...@gmail.com>

DelFusa Blog    :    http://delfusa.blog65.fc2.com/
DelFusa Floor    :    http://delfusa.main.jp/delfusafloor/


高木太郎

unread,
Feb 2, 2013, 6:43:57 PM2/2/13
to delphi...@freeml.com
 皆さま、こんにちは。 イマジオムの高木です。 久しぶりの
投稿です。 「GC」対「アンチGC」、とても興味深い話題ですね。
最初に話題提供してくださった ek さんに感謝します。

 この話題を読んで、私は「メモリマネージャも同じことかな」と
思いました。 ご存知のとおり Delphi のメモリマネージャは、
要求される割り当てサイズを考慮し、なるべく断片化が発生
しないよう、アクセスが遅くならないように割り当てるメモリの
位置を決めています。 Delphi を使っている間、このような
メモリマネージャの「気遣い」を意識する必要はほとんどありません。
しかし多くのプログラマは、この機能に非常にお世話になっています。

 しかし私の仕事では、大きいデータを高速で扱うことが多いので、
時としてメモリマネージャの機能が「ありがた迷惑」になります。
そのような場合にどうするかというと、非常に大きいメモリ
ブロックを最初に確保し、その中で独自のアルゴリズムでメモリの
割り当てを行います。 Delphi のメモリマネージャに配分して
もらったメモリの中で、独自のメモリ管理を行う。 つまりその
部分に限っては、Delphi のメモリマネージャの機能を「殺して」
しまうわけです。

 GCもこれと同じことではないでしょうか? 要するに
ありがたい機能であっても、使いたい場面と使えない場面が
あるわけです。 これに対して「是か非か」ではなくて、
「使えない場面で、使わずにすませる」方法があるかどうかが
重要だと思います。 速度や性能が必要でなければ、GCは
非常に便利です。 子オブジェクトをたくさん作り、相互に
依存性を持たせたりする場合、GCがないと依存関係の管理
機構と通知機構を作る必要があり、かなりコーディングが
増えます。 しかしGCが機能しては困る(ガベージ
コレクションをさせたくない)場合もあります。 要は、
そのための方法があればいいわけです。

 ガベージコレクションをさせたくない理由としては、プチ
フリーズを避けたいということが大きいでしょうか。 これに
対しては、(プチフリーズさせてもいいタイミングで)明示的に
ガベージコレクションを行わせる手段を備えている処理系も
あります。 ひとりでにオブジェクトが破棄されてしまうのを
防ぐには、対象オブジェクトを保持しておくグローバルな動的
配列を持たせる手もあります。 やりようはいろいろあると
思います。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=j16lC
------------------------------------------------------[freeml byGMO]--

c-yan

unread,
Feb 3, 2013, 6:45:42 AM2/3/13
to delphi...@freeml.com
ek さん
高木さん
細川さん

c-yan です.
いくつかフォローアップに気付いたので.

> >サービスは数ヶ月とか、年オーダーで走り続けるのですが・・・.
> だから、しっかりデバッグしないと・・・ ...^ ^);。

バグがなくてもメモリ不足になることがあります.
メモリのフラグメンテーションです.
オブジェクトのサイズは一定ではないので、端数が空いているけど使えない状態になることがあります.
# HDD のフラグメンテーションは、性能が落ちるだけで済みますが、メモリは連続領域であることが要求されるので

これによりメモリ使用のシナリオによっては、開放漏れがなくてもメモリ不足になることがあります.
GC の場合はコンパクション機能があれば勝手に解決されます.

現実世界の例としては

Apache: 対策として一定回数リクエストを受けたらプロセスを潰して新しいのを立てる

などがあります.
そういった、メモリ使用のシナリオによってはプログラムの本質とは関係ないことをしないといけなくなることがあります.

他の例としては Firefox が長時間使い続けるとメモリの使用量が増えていくなどもそうです.
Chrome はタブをプロセスに紐付けて、タブを閉じるたびにOSに回収させて防いでいますが、CPU使用量とメモリ使用量がトレードオフで大きくなっています.
Firefox は同時に100タブ開くのも余裕ですが、Chrome では厳しいです.
# 余談ですが、Firefox は長時間立ち上げておくとメモリ不足でクラッシュする運命にあるせいか、クラッシュしても問題なく継続できるようになってて、
# あまりクラッシュが気にならないというレベルになってしまいました(^^;
# あ、MS-Office も割とそうだな

高性能なメモリアロケータはフラグメンテーションが起きにくくなっていますが
完全では当然なく (Firefox は jemalloc 使ってるけどあの通りです)
フラグメンテーションが起きにくい代わりに、最初から端数を捨ててかかっているなどのオーバーヘッドもあります.
また、アロケーション、デアロケーションが重くなっており(開放によって連結できるところが出来たら連結するなどの処理とか)
トータルのアロケーション・デアロケーションコストがGCを使ったほうが少ないシナリオもあります. (GC 環境下でのアロケーションは軽い)
これはコンカレントGC環境下では更に発生しやすいです.
コンカレントGC: アプリケーションを走らせつつ、並行でGCをする. 当然停止時間は短い. 総CPUコストは上がるが、CPUがネックでなければ実実行時間は劇的に改善される. 最近の多コア環境ではかなり有効

別の話題としてメモリがフラグメンテーションしないので、CPU のキャッシュの利用効率が上がって、速度が上がることもあるそうです.
更に別の話題として、OS から取得したメモリブロック(チャンク)にオブジェクトが一個だけ残って返却できないケースでは、GC の場合コンパクションで移動して返却できるようになるので、
メモリ使用量が減ることもあるそうです. (Firefox はそれによるメモリ使用量も多い)

> あらゆるWebシステムは「リアルタイム性が高い」ので、「Webシステムを書く際に Java を選ぶのがおかしい」言われているような気が・・・。

世界で一番アクセスが多い Twitter が Ruby/Java で、Facebook が PHP なわけで、Web システムがリアル性が高いというのが、そもそもいろんな意味でおかしいような.
そもそも、Web アプリケーションで、非GC言語って0.1%もいなくありません?
前提がおかしいせいで結論がおかしいですよね、明らかに.

あと、Web アプリは Web 層はスケールアウトで性能が稼げるので、だいたいボトルネックはデータ層です.
DB はC言語でかかれててGC使ってないしー.
その DB のボトルネックはたいてい IO で、CPU でもメモリでもないしー.
SSD が Web アプリの性能をアクセラレーションしまくってることこの上ない昨今です.

> 非常に大きいメモリブロックを最初に確保し、その中で独自のアルゴリズムでメモリの割り当てを行います。

GC は新規割り当て時にメモリ不足じゃないと普通は走らない (Firefox みたいに例外もあります)ので、それをやれば GC 環境下でも同じです.
たいていのGC付き言語は生でメモリを触るのがめんどくさいんで、優位性はケースバイケースですが.
また、C# の場合は large object は特別扱いされて効率的ですし、ピンで止めてしまえばGC対象外になります.
あと C# は普通に HeapAlloc 呼べるので GC 対象外のメモリ確保は容易ですし、ポインタ使えます. (C# 的には行儀悪い扱いになりますが)
D言語みたいなハイブリッド言語だと、最初からGC対象外のメモリ確保が出来たりGC止めたりできます.(都合よくミックスできる)

> 最近はGCの高速化もかなり実現しているようですが、リアルタイム性の高いシステムをJavaで書く時はGCのオーバーヘッドにたいへん気を使う必要があり、精神衛生によくないのではないでしょうか。

ゲームに組み込まれるGC付き言語は参照カウントかインクリメンタルGCがついていることが多いです.
ポーズ短いです.

インクリメンタルGC: 必要なメモリを確保したら適当なところで打ち切る. 停止時間は当然短くなる.

> ということで、私は世間がGC、GCと騒ぐのが昔から理解できないのですが、皆さんはどうお考えですか。

と、GC もいろいろ進化してて、いろんなケースが OK になったり、優位になっていたりするのですが、
そういうことを知らないまま使わないことを肯定するために騒ぐ人が少なくなく・・・.
まずきっちり使ってから語りましょう.

アセンブリ言語の方が性能限界が出せるけど、C言語の方が生産性がよいため、
同じ時間をかけるのであれば、C言語の方が性能が出るという現実と同じように、
非GC言語の方が性能限界が出せるけど、GC付き言語の方が生産性がよいため、
同じ時間をかけるのであれば、GC付き言語の方が性能が出るという現実だと思っています. (一部領域のアプリケーションを除く)

また、CPU もメモリも過剰気味で、IO が性能を決めることが多くなっており、
GC がそもそも気になること自体ほとんどなくね?って感じです.
みなさん毎日 JavaScript の GC にイライラしてます?

> Android は(いわゆるPCと比べ)貧弱なハードです。

Android は珍しく実際に残念な例で、貧弱なハードに Google が新たに実装したせいで枯れてないへっぽこな VM という
二重苦だったのですが・・・最近は PC の1/4くらいの性能のCPUに、あんまり変わらない量のメモリになってしまい
正直なところ物量で解決されてしまうのは時間の問題な気がします.
実際に Windows 95 出たてのころの Java とか実用性の欠片もなかったなあと.
歴史は繰り返す.

余談:
GC のポーズ時間を決めるのは、メモリ使用量なわけですが
(メモリ使用量が倍だと倍というわけではなく、参照グラフがあるので O(nlogn) だと思われる)
逆に言えば、複数のプロセスに分けてしまえば短くなります.
本質ではないことをするのはと言っておいてするのかよという向きがあるかもしれませんが、
Web アプリケーション方面に置かれましては、最近は設定だけで勝手にそうなるようどこかの誰かが実装してくれていたりすることが多いです.

以上です.

--
c-yan
http://www.cyanet.jp/


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=j1D3I
------------------------------------------------------[freeml byGMO]--

ek

unread,
Feb 3, 2013, 10:42:55 PM2/3/13
to delphi...@freeml.com
ekです。達人の皆さんのお話、たいへんおもしろく拝聴しました。

c-yanさん>Python はメインは参照カウントです.

こういうGCもあるのですね。

フサギコさん>4画面だと、画面が起動している際に、4スレッドがそれぞれ数百枚の画像を読みにいき

これは確かに「喜々としてtry・・・finally」のレベルではなさそうです。

c-yanさん>メモリのフラグメンテーションです.

これはたいへんよくわかります。

ありがとうございました。かなりすっきりしました。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=j1Lpi
------------------------------------------------------[freeml byGMO]--

あれい

unread,
Feb 4, 2013, 12:02:56 AM2/4/13
to delphi...@freeml.com
いまAmazonには在庫が無いようですが、

ガベージコレクションのアルゴリズムと実装

  • 出版社: 秀和システム (2010/3/18)
  • ISBN-10: 4798025623
  • ISBN-13: 978-4798025629
  • 発売日: 2010/3/18
がおすすめです。
http://www.amazon.co.jp/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E5%AE%9F%E8%A3%85-%E4%B8%AD%E6%9D%91-%E6%88%90%E6%B4%8B/dp/4798025623


2013年2月4日 12:42 ek <delphi...@freeml.com>:

とっしゃん

unread,
Feb 4, 2013, 6:17:03 AM2/4/13
to delphi...@freeml.com

そもそも、プログラムを書かなければならない時代の終焉が来ることを望みます。

Sat, 2 Feb 2013 13:51:27 +0900 (JST) に、
ek <delphi...@freeml.com> さんは書きました:
--
もじもじ <mojim...@yahoo.co.jp>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日豪華プレゼントキャンペーン開催中!くまポン
http://ad.freeml.com/cgi-bin/sa.cgi?id=j1SIQ
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages