C/C++で開発したライブラリをJNIでJavaのラップを作ってみます。一番難しいところはメモリの回収だと思います。いろいろなメモリリックの問題を出ますので、一つ一つで解決して、最後まだリックされてることろがありました!ちょっと時間をかかって調べましたが、原因はGarbage Collectionとfinalizeの問題です。自分の調べた結果を簡単で纏めます。

一、Garbage Collectionとはガベージコレクション(garbage collection; GC)とは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。「ガベージコレクション」を直訳すれば「ゴミ収集」となる。

二、注意点

1、Garbarge CollectionはC++のデストラクタ関数ではありません

2、オブジェクト対象を解放する保証はありません。

三、GCが呼ばれるタイミング

1、アプリケーション占用したメモリ量が多い過ぎの場合

2、明示でSystem.gc()を呼び出す場合

例:

  1. /**
  2. * File: Chair0.java
  3. * @author Somebody
  4. */
  5. class Chair0{
  6. static boolean flag=true;
  7. static int finalizeNum=0;
  8. static int constructNum=0;
  9. Chair0()
  10. {
  11. constructNum++;
  12. }
  13. public void finalize(){
  14. flag=false;
  15. finalizeNum++;
  16. }
  17. }
  18.  
  19. /**
  20. * File Garbage0.java
  21. * @author Somebody
  22. */
  23. public class Garbage0{
  24. public static void main(String []args){
  25. while(Chair0.flag){
  26. new Chair0();
  27. }
  28. System.out.println(You have created “+
  29. Chair0.constructNum+” objects of Chair! And have finalized “+
  30. Chair0.finalizeNum+” objects);
  31. }
  32. }

実行結果1:

  1. init:
  2.  
  3. deps-jar:
  4.  
  5. Compiling 1 source file to C:\Documents and ettings\Somebody\BomClass\build\classes
  6.  
  7. compile-single:
  8.  
  9. run-single:
  10.  
  11. You have created 9783 objects of Chair! And have finalized 5 objects

構築成功 (合計時間: 0 秒)

  1. deps-jar:
  2.  
  3. Compiling 1 source file to C:\Documents and ettings\Somebody\BomClass\build\classes
  4.  
  5. compile-single:
  6.  
  7. run-single:
  8.  
  9. You have created 9783 objects of Chair! And have finalized 5 objects

構築成功 (合計時間: 0 秒)

ここまでの質問:

1、mainメソッドの終了するタイミング/条件は?

2、finalize()関数が呼ばれるタイミングは?

もう一つ例:

  1. /**
  2. * File MyClass.java
  3. * @author Somebody
  4. */
  5. class MyClass{
  6. private String name;
  7. public MyClass(String name){
  8. this.name=name;
  9. System.out.println(name+” is created.”);
  10. }
  11. protected void finalize() throws Throwable {
  12. System.out.println(finalize “+name);
  13. }
  14. }
  15.  
  16. /**
  17. * File: Garbage1.java
  18. * @author Somebody
  19. */
  20. public class Garbage1 {
  21. /** Creates a new instance of Garbage */
  22. public Garbage1(String i) {
  23. }
  24. public static void main(String []args){
  25. runrun();
  26. }
  27. public static void runrun(){
  28. MyClass myClass1=new MyClass(myClass1);
  29. new MyClass(myClass2);
  30. System.gc();
  31. int i=1;
  32. if(i==1)
  33. {
  34. MyClass myClass=new MyClass(myClass3);
  35. }
  36. System.gc();
  37. {
  38. MyClass myClass=new MyClass(myClass4);
  39. }
  40. System.gc();
  41. }
  42. }

実行結果2:

  1. init:
  2.  
  3. deps-jar:
  4.  
  5. Compiling 1 source file to C:\Documents and Settings\Somebody\BomClass\build\classes
  6.  
  7. compile-single:
  8.  
  9. run-single:
  10.  
  11. myClass1 is created.
  12.  
  13. myClass2 is created.
  14.  
  15. myClass3 is created.
  16.  
  17. finalize myClass2
  18.  
  19. myClass4 is created.
  20.  
  21. finalize myClass3

構築成功 (合計時間: 0 秒)

  1. deps-jar:
  2.  
  3. Compiling 1 source file to C:\Documents and ettings\Somebody\BomClass\build\classes
  4.  
  5. compile-single:
  6.  
  7. run-single:
  8.  
  9. You have created 9783 objects of Chair! And have finalized 5 objects

構築成功 (合計時間: 0 秒)

myClass2、myClass3がGCで回収されましたね。なぜmyClass4が回収されなかったですか。では、下記のソースを見ましょう。まだGarbage1です。

  1. /**
  2. * File: Garbage1.java
  3. * @author Somebody
  4. */
  5. public class Garbage1 {
  6. /** Creates a new instance of Garbage */
  7. public Garbage1(String i) {
  8. }
  9. public static void main(String []args){
  10. runrun();
  11. }
  12. public static void runrun(){
  13. MyClass myClass1=new MyClass(myClass1);
  14. new MyClass(myClass2);
  15. System.gc();
  16. int i=1;
  17. if(i==1)
  18. {
  19. MyClass myClass=new MyClass(myClass3);
  20. }
  21. System.gc();
  22. {
  23. MyClass myClass=new MyClass(myClass4);
  24. }
  25. System.gc();
  26.  
  27. // myClass5のケースを追加します
  28. {
  29. MyClass myClass=new MyClass(myClass5);
  30. myClass = null;
  31. }
  32. System.gc();
  33. }
  34. }

実行結果3:

  1. init:
  2.  
  3. deps-jar:
  4.  
  5. Compiling 1 source file to C:\Documents and Settings\Somebody\BomClass\build\classes
  6.  
  7. compile-single:
  8.  
  9. run-single:
  10.  
  11. myClass1 is created.
  12.  
  13. myClass2 is created.
  14.  
  15. myClass3 is created.
  16.  
  17. myClass4 is created.
  18.  
  19. finalize myClass3
  20.  
  21. myClass5 is created.
  22.  
  23. finalize myClass2
  24.  
  25. finalize myClass4
  26.  
  27. finalize myClass5

構築成功 (合計時間: 0 秒)

  1. deps-jar:
  2.  
  3. Compiling 1 source file to C:\Documents and ettings\Somebody\BomClass\build\classes
  4.  
  5.  
  6. compile-single:
  7.  
  8. run-single:
  9.  
  10. You have created 9783 objects of Chair! And have finalized 5 objects

構築成功 (合計時間: 0 秒)

myClass2、myClass3、myClass4、myClass5が回収されました!

結論:

1、 終了するまで全部変数を回収するではありません。

2、 最後の変数スコープを無効になっても解放されない可能性があります。

3、 終了した後まだ回収されていないメモリをOSに渡して管理します。

4、 使っている対象に対して、GCは回収しておりません。(myClass1

※参考(自分の別のブログなので、参考というのは大丈夫ですよね。^^!):

http://blog.minidx.com/2007/10/16/15.html

メインコンテンツEND ■
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted on Monday, 20th October 2008 by admin

Tags: , ,
Posted in Java | Comments (0) | 9,407 views

Random Posts

Leave a Reply