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

Я учусь о Java JMX и JConsole. Мне интересно узнать о возможностях управления памятью в JConsole. Например, на вкладке "Память" есть кнопка "Perform GC":

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

Предположим, у меня есть простое 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? Спасибо

3 ответа

Будет ли способ настроить JConsole, чтобы приложение не занимало X памяти?

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

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


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

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

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

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

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

Вы можете только добавлять функции 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

Другие вопросы по тегам