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