根据 pmap,JVM 总是在我的 linux 服务器中保留近 1G 内存
JVM always reserved nearly 1G memory in my linux server according to pmap
我在linux中写了一个javaclass和运行。 JVM 总是预留近 1G 的内存,不管堆大小有多大。我试过了
java -Xms512m -Xmx512m MemTe
java -Xms100m -Xmx100m MemTe
java -Xms2048m -Xmx2048m MemTe
pmap中总有一行,值为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();
}
}
}
}
}
这是。
它的默认大小恰好是 1G;可以修改为 -XX:CompressedClassSpaceSize
.
整个 Compressed Class Space 的虚拟内存最初是 reserved,但不是 committed,即它不占用物理内存。随着 Compress Class Space 的使用增长,这些页面将按需提交。这就是为什么在 pmap
输出中你会看到两个相邻区域:第一个(具有 rw
保护属性)被提交,其余被保留(RSS=0)。
0000000100000000 512 260 260 rw--- [ anon ]
0000000100080000 1048064 0 0 ----- [ anon ]
我在linux中写了一个javaclass和运行。 JVM 总是预留近 1G 的内存,不管堆大小有多大。我试过了
java -Xms512m -Xmx512m MemTe
java -Xms100m -Xmx100m MemTe
java -Xms2048m -Xmx2048m MemTe
pmap中总有一行,值为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();
}
}
}
}
}
这是
它的默认大小恰好是 1G;可以修改为 -XX:CompressedClassSpaceSize
.
整个 Compressed Class Space 的虚拟内存最初是 reserved,但不是 committed,即它不占用物理内存。随着 Compress Class Space 的使用增长,这些页面将按需提交。这就是为什么在 pmap
输出中你会看到两个相邻区域:第一个(具有 rw
保护属性)被提交,其余被保留(RSS=0)。
0000000100000000 512 260 260 rw--- [ anon ]
0000000100080000 1048064 0 0 ----- [ anon ]