2016-03-20 33 views
0

私はJavaでゲームを書いていますが、Windowsタスクマネージャーを使ってそれをしばらく監視した後、私はいくつかのメモリリークを気付きました。私はレベルをリロードするたびに2メガバイト上がりました。私のゲームコードをしばらく検索した後、敵のような他のゲームオブジェクトを格納するために使用していたArrayListオブジェクトによってメモリリークが作成されたという結論に達しました。Javaメモリの割り当て解除

私はいくつかのテストを実行するための新しいJavaプロジェクトを作成しました。 のは、私が唯一の整数を含む、かなり単純なクラスです

public class Test 
{ 
    private int i; 
    public Test() 
    { 
    i = 0; 
    } 
} 

テスト

と呼ばれるクラスを持っているとしましょう。だから私はそのようなクラスのオブジェクトは約4バイトのメモリを消費すると思います。

その後、私はTestオブジェクトの配列リストを作成し、それに10.000個のオブジェクトを埋めました。

ArrayList<Test> testList = new ArrayList<Test>(); 
for (int i=0;i<10000;i++) 
{ 
    testList.add(new Test()); 
} 

このように、タスクマネージャーに気付いたように、これは私のメモリ使用量を大幅に増やしました。 問題しかし、私は

testList.clear(); 

を使用して、アレイ全体のリストをクリアしても、まだ使用されているメモリは同じままであることである、のは、40Kを言わせて。 私の質問は、私がもはや必要としないarraylistのアイテムをどのように割り当て解除することができますか?私はJavaが自動ガベージコレクションを使用していることを知っています。オブジェクトがガベージコレクションのために理解できないようにするために、他のオブジェクトからの参照はなくてはなりませんが、なぜそれらのテストオブジェクトを割り当て解除しないのか分かりません。

System.gc()を使用しても、使用されるメモリには違いはないようです。

+1

と呼ばれるたびにあなたが使用するメモリが徐々に上がっていくと落ちて表示されるはずですパフォーマンス上の理由からOSに転送します。あなたが気にしているのは、Java内の空きメモリの量です。 [runtime.freeMemory() '](https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#freeMemory--)も参照してください。 –

答えて

0

実際のメモリ使用量ではなく、JVMによって割り当てられたメモリが得られます。

これは私が実際のメモリ使用量を監視するために使用するものである:

int mb = 1024 * 1024; 

String memory = "Total Memory: " + (Runtime.getRuntime().totalMemory()/mb) + "MB\nFree Memory: " 
      + (Runtime.getRuntime().freeMemory()/mb) + "MB\nUsed Memory: " 
      + ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/mb) + "MB"; 

ガベージコレクタはJavaが戻って空きメモリません

+0

お返事ありがとうございます。 – exophrenik

関連する問題