2012-02-22 12 views
1

Javaの場合、必要に応じてメモリを解放する方法があるかどうかは、iOSのUIApplicationDidReceiveMemoryWarningNotificationのように非常に興味がありますか?Javaメモリ管理:iOSスタイルのメモリ監視?

たとえば、私のプログラムでキャッシュ構造として使用されていた配列があり、JVMにメモリの負荷(ヒープスペースが空になっています)がある場合、GCを強制してメモリを解放するよう通知することができます。アレイキャッシュ?あなたは質問があなたに明確ではないと思われる場合

のJava VM自体がメモリを管理

答えて

3

GCは必要なときに自動的に実行されるため、通知する必要はありません。

メモリが不足しているときに手動でエントリを削除するキャッシュの場合は、SoftReferenceを使用できます。キャッシュエントリへのソフトリファレンスのみを保持している場合、メモリが必要な場合は、ガベージコレクタがキャッシュからエントリを自動的に削除します。

たとえば、Guavaライブラリ(CacheBuilder参照)のように、これを処理するための既存のキャッシュ実装がかなりあります(それを正しく取得するのは簡単ではありません)。

+1

+1 softrefferencesとguavaで同様の回答を投稿したいと思っています:) Java参考文献の理解を深めるために私は[この記事を見ました](http://www.kdgregory.com/index.php?page=java.refobj)便利です。 –

+0

答えをありがとう!これは十分に証明された回答であることを嬉しく思う(@PhilippWendler @ortangと@mikera)! – asksw0rder

0

〜コメントしてください。 キャッシュオブジェクトへのヌル参照を作成して呼び出します。 System.gc()

Javaはヒープ領域をクリーンアップします。私が知る限り、あなたができることは何もありません。

+2

System.gc()を呼び出すとガベージコレクタが呼び出されません。むしろ、VMにはそうすることができるというヒントが与えられます。それが実際にそれを行うことを実際に選択するかどうか。一般的に、System.gc()を呼び出すことは、あなたの問題に対する答えではありません。正直言って、私は実際にそれを呼び出すことが有用な場合は見たことがない(私は1つを見たいと思うが)。 – RHSeeger

2

Javaでは、一般的にはGCがメモリを処理するようにする必要があります。そして、あなたは(Weak Referencesのより一般的なカテゴリのバリアントである)ソフト参照に基づいていずれかを使用する必要がありますが、メモリの圧力がある場合にクリアされますキャッシュをしたい場合は

、。オブジェクトがソフトリファレンスによってのみ参照される場合、GCはメモリが不足する前にオブジェクトをクリアします。

ソフトリファレンスキャッシュを作成する簡単な方法は、GuavaのCacheBuilderです。

1

上記のSoftReferenceの他に、たとえば、約95%のメモリ使用量:

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); 
NotificationBroadcaster emitter = (NotificationBroadcaster) mbean; 
emitter.addNotificationListener(new NotificationListener() { 
    public void handleNotification(Notification notification, Object handback) { 
    System.out.println("Low memory notification"); 
} 
}, null, null); 
for (MemoryPoolMXBean memPool : ManagementFactory.getMemoryPoolMXBeans()) { 
    if (memPool.isUsageThresholdSupported()) { 
    MemoryUsage memUsage = memPool.getUsage(); 
    memPool.setUsageThreshold((long) (memUsage.getMax() * 0.95)); 
    } 
} 
+0

答えに@Robertありがとう!私はグアバを最初に試してみると思いますが、これは間違いありません。 – asksw0rder