2016-07-03 3 views
0

私はJavaでゲームを作っています。私はすぐにオーディオ再生をテストしていました。以下のコードが主な方法です。Javaのガベージコレクタ発生

final CountDownLatch latch = new CountDownLatch(1); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new JFXPanel(); 
      latch.countDown(); 
     } 
    }); 
    try { 
     latch.await(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    //assets grabs a Media object 
    new MediaPlayer(Assets.getMedia("aBstracT - Vivacious Vagabonds.mp3")).play(); 
    //cannot create an anonymous inner class of media player 
    new Object() { 
     @Override 
     public void finalize() { 
      System.out.println("Garbage collected"); 
     } 
    }; 

私は音楽が40秒で一貫して停止したことを見つけるために混乱していました。私の推測はガベージコレクション(私はメディアオブジェクトへの参照を保持していないことを認識した)でした。これは印刷物から確認しました。

私の質問は次のとおりです:

なぜ40秒ですか?ガベージコレクションはいつ行われるのですか?私はこの奇妙なことを発見し、JVMは未使用のオブジェクトが多すぎる場合にのみガベージコレクションを試みると常に考えていました。

第2に、オブジェクトをガベージコレクションするためにJVMをマークする方法はありますか? JVMがすべてのオブジェクトへの参照を調べてからメモリから削除する必要があるかどうかを判断するのは非効率的です。ガベージコレクションが間違っていた場合のメモリリークについても心配しています。

ありがとうございます。

+1

"ガベージコレクションが間違っていました"それを心配しないでください。よりスマートな人々によって書かれていますので、あなたが書いたコードに集中する必要があります。 – Kayaman

答えて

2

質問に答えるには:GCはいつでもジャンプするという保証はありません。オブジェクトを使用しない場合、GCは決して起こらないように実装できます。これは完全に実装に依存しており、SunとOracleはさまざまなGC実装を実装しています。あなたの場合、JVMバージョンでは、40秒後に起動します。メモリを追加すると、そのタイマーが変更されることがあります。 Androidで実行すると変更される可能性があります.JDK 9にアップグレードすると変更される可能性があります。

2番目の質問も同じです:GCへの参照をすべて削除してオブジェクトをマークします。ローカル変数のnullへの非常に一般的な設定はまったく役に立たない。メソッドを終了すると、変数、したがってオブジェクトへの参照が削除されます。 GCで間違いはありません。もしそうなら、それはJVMのバグであり、あなたが想像するよりも大きな問題です:

あなたはGCのパフォーマンスが心配なら、あなただけではありません。しかし正直言って、それはもう大きな問題ではない。 GCがあなたのアプリケーションをフリーズするのを避けるために割り当てる必要があるメモリについて確かめる必要があります。 GCメカニズムの概要を確認するには、ここをクリックしてください:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

問題を解決するには、メディアプレーヤーでリファレンスを保持する必要があります。

関連する問題