- ベストアンサー
ガベージコレクションをノートと消しゴムに例えると
Javaとかのプログラミング言語には「ガベージコレクション」という機能がありますが、この機能を「ノート」と「消しゴム」に例えると・・・ 「ノート」→「メモリ」 「消しゴム」→「ガベージコレクション」 上記のように例えると、「ノートに書いてある邪魔になった不要な箇所の落書きを消しゴムで消して、書ける空白の領域を確保する」というイメージでよろしいのでしょうか?(おおまかな例えですが・・・) 回答のほうよろしくお願いします。
- taritarianime
- お礼率3% (53/1523)
- その他(プログラミング・開発)
- 回答数5
- ありがとう数1
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
使用中領域を纏めて詰める処理はコンパクションと言い、ガベージコレクションというゴミ集め処理のついでに行われる処理系もありますが、厳密には別です。 本来の質問ですが、「ノートに書いてある邪魔になった不要な箇所の落書きを消しゴムで消して、書ける空白の領域を確保する」のうち「落書き」→「書き込み」への変更と、「邪魔になった」を削除すればその解釈で良いと思います。 書かれている内容が落書きなのか重要な情報であるかはガベージコレクションにとって関知しない事で、邪魔なのかも関知していないことで、他の用途に利用できるよう処理する事が仕事だからです。 メモリ領域を管理している札があって、その札を未記入の新しい物に変えるだけ、という簡単な物もあれば、セキュリティが絡むので開放する領域の内容をすべて消している物もあります。
その他の回答 (4)
- notnot
- ベストアンサー率47% (4848/10262)
一度回答したのですが、いいたとえを思いついたので、再度です。 ガベージコレクションは直訳すると「ごみ集め」です。 散らかった部屋があるとすると、どれを残して、どれを捨てるかを決めて、捨てるものをゴミ袋に詰めるのが、ガベージコレクションです。 そのあと、そのゴミ袋をゴミ回収に出すのが、ノートのたとえの消しゴムですね。
- asciiz
- ベストアンサー率70% (6639/9406)
>「ノートに書いてある邪魔になった不要な箇所の落書きを消しゴムで消して、書ける空白の領域を確保する」 微妙に違いますかね…ガベージコレクションをしても、現在確保されているメモリ量は変わりません。 すなわち、空き領域(の総量)が増えるわけではありません。 メモリがノートだとして、鉛筆と消しゴムで情報を書いたり消したりしている、それが普段の作業です。消しゴムも、普段から使っています。 ただ、必要な情報をいくつも書いて、その中から不要な所を消し、また必要な情報を書いて…としていくと、メモリ(紙面)が分断され、大きな空白が無くなってきます。 しまいには、紙面の所々に小さな空白はあるけども、大きな配列は確保できない状態となってしまいますね。 そこで、現在ある情報をノートの頭からきっちり詰めるように書き直し、大きな空白を確保する、この作業が、ガベージコレクションです。 ガベージコレクションを実行する前後でメモリの空き領域は変わらないのですが、ガベージコレクション前には確保できなかった大きな配列が確保できるようになります。 私のイメージだとそんな感じですね。
- fujic-1990
- ベストアンサー率55% (4505/8062)
ガーベジコレクションとは、『プログラムが動作するときに使っていたメモリー領域を、使用しなくなった時に自動的に解放する機能のこと』(パソコン用語事典)です。 プログラムは、動いている時に、例えば計算領域としてメモリーの一定部分をあらかじめ確保してしまう(他のプログラムには使わせない!)わけです。で、複数のプログラムを同時に動かすと、メモリーの余裕部分がドンドン減ってしまうわけです。 そうするとどれかのプログラムが動かなくなるので、当面使わないでいるメモリー領域を「どのプログラムが、何につかってもいい場所」として自動的に解放してしまう機能が備えられているわけです。 書き込まれている内容を消してしまってもいい場合もあるでしょうが、いま使っている領域の内容を消してしまっては、消されたプログラムが働けなくなる場合も出てきます。だから、基本的にはすでに書かれている内容は消さず、その部分はガーベジコレクションの対象外にすると思います。 つまりこれを例えれば、先生(Java)がそうしなさいと言うから、私が自分用に確保したルーズリーフノートの白紙ページをはずして、あとで私が困るかも知れないけどそれは覚悟して、書き込む白紙ページがなくて今現在困っている質問者さんに貸す、というようなイメージですかね。 消していいのか、貸して良いのか、などなどの判断基準は、あらかじめJavaやC#の本体に書き込まれているはずです。
- notnot
- ベストアンサー率47% (4848/10262)
ガベージコレクションは、メモリのどの部分をまだ使っているか、どの部分をもう使わないので再利用しているか、を決めるものです。 なので、消しゴムじゃなくて、「書いてある物を読んで要不要を判断する」という部分がガベージコレクションの肝です。 消しゴムで消すことはガベージコレクションの後始末ですね。
関連するQ&A
- GOMプレーヤーについて教えて下さい。
ITの専門学校でプログラミングを学んでいてフリーソフトを作ることに興味があります。 それでGOMプレーヤーのようなフリーソフトは一人で自作することは可能でしょうか? また、言語はJAVAやC#でできますか? 回答よろしくお願いします。
- ベストアンサー
- フリーウェア・フリーソフト
- 動的確保について
こんばんは。プログラミングについてお聞きしたい事があり 投稿させて頂きました。初心者なので見当違いでしたら申し訳 ありません。 現在、C言語でプログラムを作成しているのですが、メモリの 動的確保をする際、確保する領域の先頭アドレスを指定するという ことは出来ないのでしょうか。 現在はmallocを使用して領域を確保していますが、実験の都合上、 どうしても自分で確保すべき領域を指定したくなりました。 調べても分からないのでもしノウハウをお持ちの方がいましたら 教えて頂けますでしょうか。 宜しくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- c言語のmalloc関数、またrealloc関数
c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。
- 締切済み
- C・C++・C#
- C++の将来性・・・
昨年まで、C++プログラマをしていました。しかし恥ずかしながらぜんぜんオブジェクト指向じゃないコードを書いていました・・・ いまJavaで仕事していて感じるのですが、C++にはガベージコレクションがないので、実はオブジェクト指向プログラミングがとてもやりにくい言語ではないですか? そうなると、C++の必然性がなくなり、C Java C# に取って代わられてC++は消え去っていく言語なのでしょうか。 「いやC++はすばらしいオブジェクト指向言語だ!」というお叱りを期待しています。
- ベストアンサー
- C・C++・C#
- メモリを確保する方法(アセンブラにおけるORGの様な)ありませんか?
PICボードの制御プログラミングをC言語で行っています。 通常は、コンパイラで自動的にメモリ領域の確保を行ってくれます。 そこをあえてプログラミングで操作したいのですが 何か良い方法がありましたら教えて下さい。 目的プログラムは、タイマ割り込みによるLEDの制御です。 組み込みソフトウェア開発の勉強中です。
- 締切済み
- C・C++・C#
- c言語のメモリの確保について
c言語で変数を宣言したり、領域を確保したりする場合に、メモリ上のこのアドレスに領域を確保する、といったように場所を指定することはできるのでしょうか?
- ベストアンサー
- C・C++・C#
- 使わなくなった変数に違う値を入れるのはマズイ?
CやJAVAのような、厳密な型の存在しない言語(Perl、PHP、Javascriptなど)についての質問です。 プログラミングをしていて、途中である変数が要らなくなることがあります。これを、せっかく宣言したので別の値、それも型が違ったりプリミティブ型の値を入れてたのにオブジェクト型を入れるとか、そういう使い方をすることがあります。 例(Javascriptの場合) $hen = new Array(10); $hen[0] = 0; $hen[1] = 1; . . . for (i=0; i<10; i++) { print $hen[$i]; } //ここで配列henは要らなくなった。変わりに文字列が欲しい。 $hen = "String"; //せっかく変数henがあるので、これを入れ物として使う。 最近、C++の勉強をして、このようなケースで変数名との結びつきが無くなった変数の中身は、存在はするがアクセスする手段を失った「ゴミ」となるということを知りました。多くの言語も、同じような構造だとも知りましたが、同時に「ガベージコレクション」を装備している言語は、プログラムがその値が以降使われないと判断された場合は自動でその変数に割り当てているメモリを開放して処理速度向上を図る・・・とありました。では、例として挙げたケースでは、ガベージコレクションを装備していれば、ゴミは発生するがプログラムが自動でメモリを開放してくれるのでそこまで気にしなくても良い、という解釈で良いのでしょうか?私はPHPが得意なのですが、PHPは標準ではガベージコレクションを装備していないようなので、気をつけてプログラミングしようと思っているのですが。 余談ですが、「変数名と内容が一致しなくなるケースがある($arr = new Array();を後で$arr = "String";とするなど)からやめたほうが良い」という突っ込みはナシでお願いします。その点は承知していますので。
- 締切済み
- その他(プログラミング・開発)
- C言語におけるローカル変数が使用するメモリについて
例のようなC言語のプログラムを動かした場合、 確保されるメモリ領域はどうなるのでしょうか。 例 #include <stdio.h> int main(void) { int a = 0; } このとき、変数aはint型なのでスタック領域に4バイトのメモリが確保されると理解しています。 と同時にaという変数名と確保されたスタック領域の番地を紐づけるようなメモリがどこかに確保されるのではないかと思ってるのですが、この理解で正しいでしょうか。 またその場合は変数aの番地はどの領域に確保されるのでしょうか。 ご教示お願いいたします。
- ベストアンサー
- C・C++・C#
- プログラミング言語 rubyを用いて、
プログラミング言語 rubyを用いて、 画像処理プログラミングを書こうとしていますが、以下の点が分かりません。 1・メモリの動的確保はどうするの?(C言語でいうmalloc) 2・ファイルから配列に展開するにはどうしたらいいの? 以上が分かればわかるきがするのですが・・ 当方 C言語での画像処理プログラミングはそれなりに経験があるのですが rubyで実現できるのかわからなくて・・
- ベストアンサー
- Ruby