JVM всегда резервировала около 1 ГБ памяти на моем Linux-сервере в соответствии с pmap

Я написал класс 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();
        }
      }
    }

  }
}

person FFMan    schedule 15.03.2019    source источник


Ответы (1)


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

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

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

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

person apangin    schedule 15.03.2019
comment
Думает вам за ваш полезный ответ. Другой вопрос, почему RSS и грязный 0? Я попытался создать экземпляр класса разницы в основном методе. Но значение RSS не меняется. всегда 0 как ваша вставленная ссылка. - person FFMan; 19.03.2019
comment
Я думаю, что фиксированный размер Compress Class Space не должен быть равен 0, когда основная функция работает, потому что загрузчик классов загрузил некоторые классы в пространство. Но на самом деле 0. Это мой новый вопрос. - person FFMan; 20.03.2019
comment
@FFMan Это не ноль. В вашем случае выделенное пространство начинается с 100000000 и заканчивается на 100080000 или 1000e0000. Поскольку он примыкает к куче и имеет те же атрибуты защиты, он отображается как единый регион вместе с кучей. - person apangin; 20.03.2019