JVM всегда резервирует почти 1G памяти на моем Linux-сервере в соответствии с pmap - PullRequest
2 голосов
/ 15 марта 2019

Я написал класс Java и запустил его в Linux.JVM всегда резервирует почти 1 Гб памяти независимо от размера кучи.Я пробовал

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 16 ГБ памяти

Любойможете объяснить почему?Спасибо

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();
        }
      }
    }

  }
}

1 Ответ

2 голосов
/ 15 марта 2019

Это Сжатое пространство классов .
Его размер по умолчанию ровно 1G;можно изменить с помощью -XX:CompressedClassSpaceSize.

Виртуальная память для всего сжатого пространства классов изначально зарезервирована , но не зафиксирована , т. е. она не занимает физическую память,Страницы передаются по требованию по мере роста использования Compress Class Space.Вот почему в выводе pmap вы увидите две соседние области: первая (с rw атрибутами защиты) зафиксирована, а остальные зарезервированы (RSS = 0).

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

Подробнее о виртуальной памяти JVM

...