Memory 根据pmap,JVM总是在我的linux服务器上保留近1G的内存
我编写了一个java类并在linux中运行它。JVM总是保留近1G的内存,不管堆大小有多大。我试过了Memory 根据pmap,JVM总是在我的linux服务器上保留近1G的内存,memory,jvm,pmap,Memory,Jvm,Pmap,我编写了一个java类并在linux中运行它。JVM总是保留近1G的内存,不管堆大小有多大。我试过了 java -Xms512m -Xmx512m MemTe java -Xms100m -Xmx100m MemTe java -Xms2048m -Xmx2048m MemTe pmap中始终有一行,值为1048064 104768 000000000204c000 132 12 12 rw--- [ anon ] 00000000e0000000 52
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;
导入java.util.ArrayList;
导入java.util.List;
公共类成员{
静态可变布尔运行=false;
静态字符串s=null;
静态int-tcnt;
公共静态void main(字符串args[])抛出{
List st=新的ArrayList();
while(System.in.read()>0){
运行=错误;
线程t=新线程(MemTe::go);
t、 start();
tcnt++;
System.out.println(“线程:+tcnt”);
System.out.println(System.in.read());
RUN=true;
圣加达(s);
}
}
私有静态void go(){
while(true){
while(RUN){
System.out.println(Thread.currentThread().getId());
s=新字符串(“s”);
试一试{
睡眠(100000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
}
}
这是。它的默认大小正好是1G;可以使用
-XX:CompressedClassSpaceSize
进行修改
整个压缩类空间的虚拟内存最初是保留的,但没有提交,即不占用物理内存。随着压缩类空间使用量的增加,页面会按需提交。这就是为什么在pmap
输出中,您将看到两个相邻区域:第一个区域(具有rw
保护属性)被提交,其余区域被保留(RSS=0)
谢谢你的回答。另一个问题是为什么RSS和dirty是0?我尝试在main方法中创建差异类实例。但是RSS值没有改变。始终将0作为粘贴链接。我认为当主函数运行时,Compress类空间提交大小不应为0,因为classloader已将一些类加载到空间中。但实际上是0。这是我的新问题。@FFMan,不是零。在您的情况下,提交的空间从
100000000
开始,到10000000
或100000000
结束。由于它与堆相邻并且具有相同的保护属性,因此它与堆一起显示为单个区域。
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();
}
}
}
}
}
0000000100000000 512 260 260 rw--- [ anon ]
0000000100080000 1048064 0 0 ----- [ anon ]