2

我写了一个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;
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();
        }
      }
    }

  }
}
4

1 回答 1

2

这是压缩类空间
它的默认大小正好是 1G;可以修改-XX:CompressedClassSpaceSize

整个压缩类空间的虚拟内存最初是保留的,但没有提交,即它不占用物理内存。随着 Compress Class Space 使用量的增长,这些页面会按需提交。这就是为什么在pmap输出中您会看到两个相邻区域:第一个(具有rw保护属性)已提交,其余区域被保留(RSS=0)。

0000000100000000     512     260     260 rw---   [ anon ]
0000000100080000 1048064       0       0 -----   [ anon ]

更多关于 JVM 虚拟内存

于 2019-03-15T14:20:57.793 回答