Потребление памяти JVM вдвое больше размера кучи - PullRequest
0 голосов
/ 14 октября 2010

Я установил максимальный размер кучи в 4 ГБ для 64-битной Weblogic JVM. Когда я стресс-тестирую приложение, размер кучи никогда не превышает 4 ГБ, но java.exe в диспетчере задач может потреблять до 10 ГБ. Откуда это потребление?

Ответы [ 2 ]

0 голосов
/ 16 марта 2013

Общий объем используемой / свободной памяти программы можно получить в программе через java.lang.Runtime.getRuntime ();

У среды выполнения есть несколько методов, связанных с памятью. Следующий пример кодирования демонстрирует его использование.

import java.util.ArrayList;
import java.util.List;

public class PerformanceTest {
  private static final long MEGABYTE = 1024L * 1024L;

  public static long bytesToMegabytes(long bytes) {
    return bytes / MEGABYTE;
  }

  public static void main(String[] args) {
    // I assume you will know how to create a object Person yourself...
    List<Person> list = new ArrayList<Person>();
    for (int i = 0; i <= 100000; i++) {
      list.add(new Person("Jim", "Knopf"));
    }
    // Get the Java runtime
    Runtime runtime = Runtime.getRuntime();
    // Run the garbage collector
    runtime.gc();
    // Calculate the used memory
    long memory = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("Used memory is bytes: " + memory);
    System.out.println("Used memory is megabytes: "
        + bytesToMegabytes(memory));
  }
} 
0 голосов
/ 17 июля 2011

Ну, колоссальные могут иметь много причин, и ни одна из них не является особенно захватывающей.Во-первых, как было сказано ранее, в «диспетчере задач», посмотрите на подробную информацию о процессе и убедитесь, что вы смотрите на рабочий набор, а не на размер фиксации памяти (виртуальная память).

Затем, нижеэто список (в верхней части моей головы) вещей в процессе JVM, которые не будут считаться кучей java, другие могут добавить в список (или, возможно, вычесть или уточнить):

  • Пермский генерал
  • Пространство стека потоков
  • Сегменты общего кода
  • Обработка сегментов частного кода
  • В буферах ввода-вывода в процессе
  • JVM "данные / код" (точки доступа, различные временные файлы, кэши и т. Д.)
  • Фрагментация памяти в вышеупомянутых данных

Но я согласен с вами, если вы действительно ищетена рабочем комплекте это звучит немного колоссально.На наших 32-битных серверах смолы под большой нагрузкой (Debian Linux) у нас обычно используется 1-1,5 ГБ памяти без использования Java-кучи.

...