0

UPDATE2: もともと、この問題は MongoDB と Jackson と混同されていましたが、実際にはたくさん作成するだけで再現できStringsます。

問題は、多数の小さな を作成するStringと、JVM メモリの約 10% が永久に失われるように見えることです。これは、文字列を 3 回作成した後にのみ発生し、再度発生することはないようです。

これは、Java の「機能」またはバグのようです。

UPDATE3: JVM は で開始され-Xms3000mます。

更新 4:文字列のインターンと関係があるのか​​もしれません。

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class TestMemLeak {

    public static String TEXT100 = "";
    static {
        for (int i = 0; i < 10; i++) {
            TEXT100 += "aaaaabbbbb";
        }
    }
    public static String TEXT1000 = "";
    static {
        for (int i = 0; i < 10; i++) {
            TEXT1000 += TEXT100;
        }
    }

    public static void main(String[] args) throws Exception {
        for (int i: Arrays.asList(1, 2, 3, 4)) {
            System.out.println("---------- " + i + " ------------");
            System.gc();
            try {
                makeStrings();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static List<String> makeStrings() throws Exception {
        printMem("*** start ***");
        List<String> l= new LinkedList<String>();
        for (int i = 0; i < 1000000; i++) {
            l.add("" + TEXT1000);
        }
        printMem("*** end ***");
        return l;
    }

    public static void printMem(String s) {
        System.out.println(s);
        System.out.println("free mem: " + Runtime.getRuntime().freeMemory());
        System.out.println(" max mem: " + Runtime.getRuntime().maxMemory());
        System.out.println(" ttl mem: " + Runtime.getRuntime().totalMemory());
    }
}

以下に出力します。3 番目のループでは、使用可能なメモリが完全に削除されることに注意してください。これは、以降のループでは発生しません。

---------- 1 ------------
*** start ***
free mem: 2967193768
 max mem: 3014656000
 ttl mem: 3014656000
*** end ***
free mem: 937879792
 max mem: 3014656000
 ttl mem: 3014656000
---------- 2 ------------
*** start ***
free mem: 2998712752
 max mem: 3014656000
 ttl mem: 3014656000
*** end ***
free mem: 938854128
 max mem: 3014656000
 ttl mem: 3014656000
---------- 3 ------------
*** start ***
free mem: 2998619464
 max mem: 3014656000
 ttl mem: 3014656000
*** end ***
free mem: 729745856
 max mem: 2796224512
 ttl mem: 2796224512
---------- 4 ------------
*** start ***
free mem: 2788946120
 max mem: 2796224512
 ttl mem: 2796224512
*** end ***
free mem: 726522240
 max mem: 2796224512
 ttl mem: 2796224512

Java: 1.7_25

4

0 に答える 0