powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / MBeanServerInvocationHandler ошибка out of memory
10 сообщений из 10, страница 1 из 1
MBeanServerInvocationHandler ошибка out of memory
    #38869144
irogerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

У меня есть два класса: A и B.
Класс А вызывает В, в классе В есть строчка:
Код: java
1.
x = (DomainRuntimeServiceMBean)MBeanServerInvocationHandler.newProxyInstance(conn, new ObjectName(DomainRuntimeServiceMBean.OBJECT_NAME));



Через некоторое время вылетает ошибка Out of Memory при вызове класса B.

С помощью профайлера установил, что класс В в heap не накапливается, а вот экземпляры MBeanServerInvocationHandler из heap не удаляются.

Если эту строчку закомментировать, то ошибка out of Memory не появляется и никаких других экземпляров класса А и В в памяти не копиться.

Помогите разобраться почему GC не очищает heap от MBeanServerInvocationHandler.
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38872661
irogerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось найти следующее:
Проблема возникает при создании нового connection. Т.е. в классе A есть следующий вызов методов класса B
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class A{ 

public void invoke(){
x = new B()
x.initConnection(hostname, portString, username, password);
x.run();
}
}



Класс В выглядит следующим образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class B(){
public void initConnection(String hostname, String portString, String username, String password) throws IOException, MalformedURLException, MalformedObjectNameException {
        service = new ObjectName(combea + service1);
        String protocol = "t3";
        Integer portInteger = Integer.valueOf(portString);
        int port = portInteger.intValue();
        String jndiroot = "/jndi/";
        String mserver = "weblogic.management.mbeanservers.domainruntime";
        JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, jndiroot + mserver);
        Hashtable h = new Hashtable();
        h.put(Context.SECURITY_PRINCIPAL, username);
        h.put(Context.SECURITY_CREDENTIALS, password);
        h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
        connector = JMXConnectorFactory.connect(serviceURL, h);
        conn = connector.getMBeanServerConnection();
    }

public void run(){
x = (DomainRuntimeServiceMBean)MBeanServerInvocationHandler.newProxyInstance(conn, new ObjectName(DomainRuntimeServiceMBean.OBJECT_NAME));
}
}



Если вызвать несколько раз метод Invoke() из класса A, то в памяти останется столько же классов MBeanServerInvocationHandler сколько было вызовов. Если же изменить класс А следующим образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class A{ 
private B x = new B();

public A(){
x.initConnection(hostname, portString, username, password);
}

public void invoke(){
//x = new B()
//x.initConnection(hostname, portString, username, password);
x.run();
}
}



И затем вызывать метод invoke(), то в heap будет только один экземпляр класса MBeanServerInvocationHandler.

Так как по задаче, мне нужно создавать несколько различных коннекшенов, то обошел эту ситуацию созданием списка объектов класса В и первоначальной их инициализацией и далее по шедулеру происходит вызов метода run() из В.

Способ явно костыльный, так как коннекшены иногда "портятся" и приходится создавать новые, что в итоге опять приводит к накоплению памяти, но уже не так быстро.

Понять причины почему GC не очищает MBeanServerInvocationHandler пока так и не удалось.
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38872677
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запускаешь свой сервер локально. Создаешь утечку.
Запускаешь JDK/bin/jvisualvm.exe локально
Выбираешь Java процесс своего сервера из списка - соединяешься с ним
Нажимаешь кнопку [Dump Heap]
Открываешь дамп кучи, сортируешь по имени класса, открываешь свой MBeanServerInvocationHandler, который утекает.
Открываешь просмотр экземпляров, выбираешь любой. Справа внизу - Right Click -> Find Nearest GC Root
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38872688
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
conn.unregisterMBean не пробовали пользовать?
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38873313
irogerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Пробовал, но видимо как-то не так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class B(){
public void initConnection(String hostname, String portString, String username, String password) throws IOException, MalformedURLException, MalformedObjectNameException {
        service = new ObjectName(combea + service1);
        String protocol = "t3";
        Integer portInteger = Integer.valueOf(portString);
        int port = portInteger.intValue();
        String jndiroot = "/jndi/";
        String mserver = "weblogic.management.mbeanservers.domainruntime";
        JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, jndiroot + mserver);
        Hashtable h = new Hashtable();
        h.put(Context.SECURITY_PRINCIPAL, username);
        h.put(Context.SECURITY_CREDENTIALS, password);
        h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
        connector = JMXConnectorFactory.connect(serviceURL, h);
        conn = connector.getMBeanServerConnection();
    }

public void run(){
ObjectName objectName = new ObjectName(DomainRuntimeServiceMBean.OBJECT_NAME);
x = (DomainRuntimeServiceMBean)MBeanServerInvocationHandler.newProxyInstance(conn, objectName);
conn.unregisterMBean(objectName);
}
}



Получаю ошибку:
Exception in thread "main" weblogic.management.NoAccessRuntimeException: [JMX:149518]An attempt was made to unregister the com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean WLS MBean through JMX.
at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:234)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:223)
at javax.management.remote.rmi.RMIConnectionImpl_1033_WLStub.unregisterMBean(Unknown Source)
at weblogic.management.remote.common.RMIConnectionWrapper$6.run(ClientProviderBase.java:582)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
at weblogic.security.Security.runAs(Security.java:61)
at weblogic.management.remote.common.RMIConnectionWrapper.unregisterMBean(ClientProviderBase.java:580)
at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.unregisterMBean(RMIConnector.java:766)
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38873385
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит это не то. Надо в дампе смотреть чем ваш прокси к серверу прибит.
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38873433
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irogerg,

А connector.close() делается где-то? В примере этого не делается, после invoke висит соединение открытым.
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38873493
irogerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FDirogerg,

А connector.close() делается где-то? В примере этого не делается, после invoke висит соединение открытым.

Это точно не помогает - проверял. Коннекшн обнуляется, а прокси остается.
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38873495
irogerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczЗначит это не то. Надо в дампе смотреть чем ваш прокси к серверу прибит.

Умений не хватает :)

Пока дамп для меня подобен "темному лесу".
...
Рейтинг: 0 / 0
MBeanServerInvocationHandler ошибка out of memory
    #38874151
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irogerg,

17224413
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / MBeanServerInvocationHandler ошибка out of memory
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]