2016-03-01 3 views
8

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

enter image description here

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

+2

Вы можете настроить сколько памяти процесс Java может потреблять в качестве опции запуска командной строки. Я не думаю, что это можно изменить во время выполнения. Http: // StackOverflow.com/questions/763295/setting-jvm-heap-size-at-runtime – Thilo

+1

Если вы обеспокоены тем, что экземпляр JVM загружает всю вашу память ОС, вы можете ограничить размер кучи JVM -Xmx64m, где вы можете заменить 64 м, чтобы указать свой максимальный разрешенный размер кучи в мегабайтах. –

ответ

3

Был ли способ настроить JConsole для предотвращения этого приложения от , потребляющего X объема памяти?

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

JConsole memory parameters readonly


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

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

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

0

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

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

0

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

Смежные вопросы