Можно ли использовать Java JConsole для автоматической настройки памяти?

Я изучаю JMX и JConsole. Мне интересно узнать о возможностях JConsole по управлению памятью. Например, на вкладке Память есть кнопка «Выполнить сборку мусора»:

введите описание изображения здесь

Предположим, у меня есть простое Java-приложение, которое съедает память, примерно так:

public class MemoryEater
{
  public static void main(String[] args)
  {
    Vector v = new Vector();
    while (true)
    {
      byte b[] = new byte[1048576];
      v.add(b);
      Runtime rt = Runtime.getRuntime();
      System.out.println( "free memory: " + rt.freeMemory() );
    }
  }
}

Можно ли настроить JConsole, чтобы это приложение не потребляло X объем памяти? Или мне нужно создать новый MBean через JMX? Благодарность


person Caffeinated    schedule 01.03.2016    source источник


Ответы (3)


Можно ли настроить JConsole, чтобы это приложение не потребляло X объема памяти?

Из JConsole мы не можем настраивать / контролировать пределы памяти. Единственный вариант, который я вижу, - это использование -Xmx во время запуска процесса Java. Глядя на снимок экрана ниже, JConsole предоставляет параметры памяти только как доступные для чтения, но не как доступные для записи.

Параметры памяти JConsole только для чтения


Или мне нужно создать новый MBean через JMX?

Даже если мы напишем наш собственный MBean, я не думаю, что возможно изменить ограничения памяти Java-процесса во время выполнения. Единственный способ - настроить ограничения памяти во время запуска с помощью -Xms и -Xmx.

Если вопрос не относится к вашему примеру кода, где вы хотите ограничить количество элементов, которые могут быть добавлены к Vector по JMX Bean и там, ограничив потребление памяти, что выполнимо, но я сомневаюсь, что это то, что ты ищешь.

person Madhusudana Reddy Sunnapu    schedule 21.03.2016

Нет, не можешь. Управление памятью Java - это ответственность сборщика мусора и реальных разработчиков программного обеспечения. Вы можете настроить распределение памяти с помощью различных типов ссылок (например, мягких ссылок), настроить параметры и алгоритм GC или попытаться принудительно вызвать GC с помощью JMX или jcmd GC.run служебная команда. Но вы не можете изменить границы памяти для работы JVM или установить максимальную отметку для заполнения кучи.

Если вам нужна другая стратегия управления памятью в Java, обратите внимание на такие продукты, как Terracotta BigMemory.

person nukie    schedule 22.03.2016

вы можете только добавлять функции MBean и вызывать их из JConsole - в операциях.

public void add(){
   byte b[] = new byte[1048576];
   v.add(b);
   Runtime rt = Runtime.getRuntime();
   System.out.println( "free memory: " + rt.freeMemory() );
}

см. здесь https://docs.oracle.com/javase/tutorial/jmx/mbeans/standard.html

person LiozM    schedule 22.03.2016