1

を使用してシステムの最大メモリを利用する方法はありますstringsか? runtime空きメモリを表示するために使用しています。私はこのコードで試しました:

class Mem{
       public static void main(String[] args) {
              System.out.println(Runtime.getRuntime().maxMemory());
              System.out.println(Runtime.getRuntime().totalMemory());
              System.out.println(Runtime.getRuntime().freeMemory());
              String str=new String("Hi");
              for(long i=0;i<1000000;i++){
                     str+="aa";
                     //System.out.println(i);
              }      
              System.out.println(Runtime.getRuntime().freeMemory());
       }
}

ただし、 はgarbage collector数回の反復ごとに動作し、メモリを解放します。最大メモリを利用させ、解放する前に空きメモリを表示することはできgcますか?

4

4 に答える 4

4

大量のメモリをすばやく割り当てて保持する方法は、次のとおりです。

List<byte[]> bytes = new ArrayList<>();
for(int i = 0; i < 1000; i++)
    bytes.add(new byte[10000000]); // 10 MB
于 2013-01-26T11:04:15.047 に答える
3

str+="aa";毎回新しい文字列を作成して再割り当てstrするため、古い文字列はガベージコレクションの対象になります。

ただし、十分に反復すると、ある段階でメモリが不足します。

forループをtry/catchブロックに配置し、OutOfMemoryErrorをキャッチし、printステートメントをcatchブロックに含める必要があります。

于 2013-01-26T10:06:02.223 に答える
3

最後に、文字列には200万文字しか含まれていません。コードのメモリを使い果たしたい場合は、次のように変更します

        str += "aa";

        str += str;

これにより、文字列が指数関数的に増加し、適度な反復回数でもガベージコレクションの量は役に立ちません。

于 2013-01-26T10:06:41.277 に答える
3

次のようなものを試してください

    System.out.println(Runtime.getRuntime().maxMemory());
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().freeMemory());
    String str = new String(new char[32_000_000]);
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().freeMemory());

str += "aa"それは非常に遅いので、間違った結論を出す可能性があることに注意してください。あなたの場合、GCはメモリを解放できません

于 2013-01-26T10:13:50.823 に答える