我写了一个java类并在linux中运行它。无论堆大小多大,JVM总是保留近1G的内存。我试过了
java -Xms512m -Xmx512m MemTe
java -Xms100m -Xmx100m MemTe
java -Xms2048m -Xmx2048m MemTe
pmap中总有一行,Value是1048064 104768 .....
000000000204c000 132 12 12 rw--- [ anon ]
00000000e0000000 524800 4368 4368 rw--- [ anon ](It's heap size)
0000000100080000 1048064 0 0 ----- [ anon ]
00000000018f9000 132 12 12 rw--- [ anon ]
00000000f9c00000 102912 2320 2320 rw--- [ anon ](It's heap size)
0000000100080000 1048064 0 0 ----- [ anon ]
000000000176d000 132 12 12 rw--- [ anon ]
0000000080000000 2098048 13104 13104 rw--- [ anon ](It's heap size)
00000001000e0000 1047680 0 0 ----- [ anon ]
Linux服务器有6VCPU 16GB内存
有谁能解释为什么?谢谢
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MemTe {
static volatile boolean RUN = false;
static String s = null;
static int tcnt;
public static void main(String args[]) throws {
List<String> st = new ArrayList<>();
while (System.in.read() > 0) {
RUN = false;
Thread t = new Thread(MemTe::go);
t.start();
tcnt++;
System.out.println("Threads: " + tcnt);
System.out.println(System.in.read());
RUN = true;
st.add(s);
}
}
private static void go() {
while (true) {
while (RUN) {
System.out.println(Thread.currentThread().getId());
s = new String("s");
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
这是Compressed Class Space。
它的默认大小正好是1G;可以用-XX:CompressedClassSpaceSize
修改。
整个压缩类空间的虚拟内存最初是保留的,但未提交,即它不占用物理内存。随着Compress Class Space的使用增长,页面将按需提交。这就是为什么在pmap
输出中你会看到两个相邻区域:第一个(使用rw
保护属性)被提交,其余的被保留(RSS = 0)。
0000000100000000 512 260 260 rw--- [ anon ]
0000000100080000 1048064 0 0 ----- [ anon ]