Memory 根据pmap,JVM总是在我的linux服务器上保留近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类并在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  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 ]