- PR -

ガベージコレクションについて

1
投稿者投稿内容
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-09-12 15:18
お世話になっております。

下記のようなロジックをくみ、ガベージコレクションによりクラスが開放されているか
を確かめようとおもったのです。

クリックしたときにクラス(cls_Panel)を作り、キータイプされたときに強制的にガーベージコレクションをしております。

そこで質問1です。
finalize()が走ればガベージコレクションが実行されメモリの開放が行われてたと理解しているのですが、それでよろしいのでしょうか?
つまり、このプログラムを実行させた結果"System.out.println("finalize");"が走れば、メモリ開放(ガベージコレクションの実行)がされたと考えて良いのでしょうか?

そして質問2です。
例えばクラス(cls_Panel)をメモリ開放できたとすれば、クラス(cls_Panel)内で定義した変数などもメモリ開放してもらえるのでしょうか?

public class Frame1 extends Frame {
 cls_Panel pnl;

 public Frame1() {
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  try {
   jbInit();
  }
  catch(Exception e) {
   e.printStackTrace();
  }
 }
 
 private void jbInit() throws Exception {
  this.setSize(new Dimension(236, 283));
  this.setTitle("remove");
  this.addKeyListener(new Frame1_this_keyAdapter(this));
  this.addMouseListener(new Frame1_this_mouseAdapter(this));
  this.setLayout(null);
 }
 protected void processWindowEvent(WindowEvent e) { 
  super.processWindowEvent(e);
  if (e.getID() == WindowEvent.WINDOW_CLOSING) {
   System.exit(0);
  }

 }

 void this_mouseClicked(MouseEvent e) {
  pnl = new cls_Panel();
  this.add(pnl, null);
  pnl.setSize(new Dimension(50, 50));
  pnl.setLayout(null);
  pnl.setLocation(20, 20);
  pnl.setBackground(Color.black);
  pnl.setVisible(true);
 }

 void this_keyTyped(KeyEvent e) {
  this.remove(pnl);
  pnl = null;
  System.gc();
 }
}

public class cls_Panel extends Panel{
 public String[] arySong;
 
 public cls_Panel() {
  arySong = null;
  arySong = new String[1];
  arySong[0] = "00000";
 }

 protected void finalize(){
  System.out.println("finalize");
 }
}
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-09-12 16:36
引用:

ボムさんの書き込み (2003-09-12 15:18) より:
下記のようなロジックをくみ、ガベージコレクションによりクラスが開放されているか
を確かめようとおもったのです。



基本的にはガベージコレクションはプログラマからはコントロールできません。
また、ガベージコレクションの実行と実際のメモリ開放は等しくありません。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6148&forum=12
このあたりで似たようなことが話されていますので参考にしてください。


引用:

そこで質問1です。
finalize()が走ればガベージコレクションが実行されメモリの開放が行われてたと理解しているのですが、それでよろしいのでしょうか?
つまり、このプログラムを実行させた結果"System.out.println("finalize");"が走れば、メモリ開放(ガベージコレクションの実行)がされたと考えて良いのでしょうか?

そして質問2です。
例えばクラス(cls_Panel)をメモリ開放できたとすれば、クラス(cls_Panel)内で定義した変数などもメモリ開放してもらえるのでしょうか?



質問1の答えは「No」です。
finalize()が呼ばれたときにはガベージコレクションは実行されていますが、
メモリが必ず開放されるとは限りません。(JVMの実装に依存します)

質問2は、ケースによります。
ここでいう変数がプリミティブであればおそらくJVM内でクラスに割り当てられた
領域と同じように扱われると思いますが、JVMの実装依存でしょう。
参照型変数であれば、GCがどのような手段で死んだインスタンスを集めるかにも
よります。


Javaを使うのであればプログラマが気にすべきは、メモリの管理ではなく、
インスタンスの管理です。
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-09-12 17:44
ご意見ありがとうございました。

>Javaを使うのであればプログラマが気にすべきは、メモリの管理ではなく、
>インスタンスの管理です。

まりりさんに教えていただいたURLの質問内容を読み、まりりさんのおっしゃっている事
が理解できました。
インスタンス管理!大切な事を教えていただきありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)