Java. Ldap.

Тема в разделе "Lotus - Программирование", создана пользователем abbatik, 27 май 2009.

  1. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Коллеги, никто не сталкивался с такой ошибкой?

    Agent Manager: Agent  error: Error cleaning up agent threads
    Agent Manager: Agent  error: java.lang.IllegalThreadStateException
    Agent Manager: Agent  error:  at java.lang.ThreadGroup.destroy(ThreadGroup.java:726)
    Agent Manager: Agent  error:  at java.lang.ThreadGroup.destroy(ThreadGroup.java:744)
    AM  Agent Manager: Agent  error:  at lotus.domino.AgentLoader.runAgent(Unknown Source)

    Ошибка возникает уже после того, как отработал последний оператор. Объекты все закрываются.

    Да. Кстати, все работало нормально, пока лотусня 6.5 стояла. После миграции на 7 появились эти утечки памяти ;) Прообгейдилась java до 1.4.2, может с этим как-то связано...
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    предположение. переподписанные ява аплеты скачали установили?
     
  3. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Не очень понял о чем речь. Откуда скачать и куда их установить?
    Если подкинете ссылочку, буду признателен.
     
  4. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    То что лотус не умеет хорошо за собой память чистить к сожалению факт:) Могу посоветовать побольше памяти под джаву выделить и по возможности проапгрейдить сервер до самой последней версии.
    http://www.ibm.com/developerworks/lotus/li...bles/index.html
    Периодически перезагружать сервер. И самое главное - нужно пересмотреть и оптимизировать код. Особенно при работе с коллекциями документов
    Обновления аплетов вам не помогут, если это не свзяано с самтаймом (что то мне подсказывает что это так)
     
  5. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Спасибо, но мне кажется увеличение кол-ва памяти не спасает от утечек памяти. А перегружать почаще сервер не получится, ибо он стоит у заказчика и на нем в течении дня работает очень большое кол-во пользователей.
    По поводу пересмотра кода, вряд ли, ибо он уже оптимизирован как надо, да и как было сказано выше, на 6.5 все работало нормально.
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    вот хорошо бы знать что за код юзается...
    потому как доминошная жвм очень не любит сторонних нитей и асинхронных объектов (типа открытых потоков, сокетов...)
    в агенте все обекты должны мочь уничтожаться, по завершении агента
    ежели это невозможно по архитектуре приложения - выносить библиотеку из базы (покладевать в jvm/ext или пропис. путя в нотес ини)
     
  7. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Весь агент выложить не могу, но ассинхронных объектов вроде нет.
    Все объекты закрываются:
    Код (Text):
    finally {
    try {
    System.out.println("Recycling Domino objects...");
    if (pfdoc!=null) pfdoc.recycle();
    if (staffProfileDoc!=null) staffProfileDoc.recycle();
    if (mailDoc!=null) mailDoc.recycle();
    if (deptDoc!=null) deptDoc.recycle();
    if (docCol!=null) docCol.recycle();
    if (viewUniqueTest!=null) viewUniqueTest.recycle();
    if (viewRetired!=null) viewRetired.recycle();
    if (missingPeopleView!=null) missingPeopleView.recycle();
    if (viewStaffSearchRu!=null) viewStaffSearchRu.recycle();
    if (viewStaffSearchPersopPosts!=null) viewStaffSearchPersopPosts.recycle();
    if (viewStaffSearchHN!=null) viewStaffSearchHN.recycle();
    if (viewStaffSearchEN!=null) viewStaffSearchEN.recycle();
    if (viewDepts!=null) viewDepts.recycle();
    if (missingPeopleView!=null) missingPeopleView.recycle();
    if (dbCurr!=null) dbCurr.recycle();
    if (dbStaff!=null) dbStaff.recycle();
    if (moveAgt!=null) moveAgt.recycle();
    if (srvName!=null) srvName.recycle();
    if (rtstyle!=null) rtstyle.recycle();
    if (rtstyleBold!=null) rtstyleBold.recycle();
    if (agentContext!=null) agentContext.recycle();
    ctx.close();
    ctx=null;
    session.recycle();
    //System.gc();
    System.out.println("Domino objects have been recycled!");
    }
     
  8. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    Памяти все таки лучше добавить, а сервер можно перегружать раз в месяц ночью (настроить по расписанию) это не большая проблема как по мне, но стабильности добавит.

    То что в файнали ресайклится это хорошо:) но в примере я заметил docCol, view* - если в коллекции или представлении идет перебор документов, то здесь и есть как раз потенциальное место утечки памяти.
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    вот это if (agentContext!=null) agentContext.recycle();
    зачем?
    Нотуса сама это делает
    все объекты уничтожатся после завершения, не надо в файнали это делать
    их надо после использования уничтожать, сразу
    ctx остался - ежели внешняя шняга - наружи д.б. и желательно не закрывать её до завершения жвм
    сделать сиглтоном (в наружней библе)
    потому как ежели оно вызывает нативные длл - могет жрать память при многократных передергиваниях
     
  10. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Добавлять пробовали, не помогает.

    Да, перебор документов есть. А в чем проблематичность перебора?

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

    ctx, да остался, до завершения жвм

    На счет наружней библиотеки не уверен, хочу наоборот попробовать в этот агент добавить функции вызываемые из библиотеки, может в этом причина...
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    я к тому что ежели библа в базе - то объект ctx будет уничтожаться (попытка) и ваш клозе не изменит ситуации!
     
  12. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Да, библа в базе, конечно. Хуже от клосе не будет :)

    В общем написали PMR в IBM, подождем, что они ответят...
     
  13. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    ну приблизительно вот так

    Код (Text):
    import lotus.domino.*;

    public class Temp extends AgentBase {

    //Хорошая реализация
    public void V1() {
    ViewEntry entry = null;
    ViewEntryCollection col = null;
    Document doc = null;
    View view = null;

    try {
    col = view.getAllEntries();
    int appCount = col.getCount();
    for (int i = 1; (i <= appCount); i++) {
    entry = col.getNthEntry(i);
    doc = entry.getDocument();
    // ....
    doc.recycle();
    entry.recycle();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    // Плохая реаллизация. Утечка памяти
    public void V2() {
    Document doc = null;
    View view = null;
    try {
    doc = view.getFirstDocument();
    while (doc != null) {
    // ...
    doc = view.getNextDocument(doc);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    }
     
  14. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    По-моему так уже кто-то пробовал, судя по закоментированным строчкам :) :)

    Код (Text):
            deptDoc = viewDepts.getFirstDocument();
    while (deptDoc != null) {

    бла-бла...

    //deptDoc.recycle();
    //deptDoc=null;
    deptDoc=viewDepts.getNextDocument (deptDoc);
    }
     
  15. Yakov

    Yakov Гость

    abbatik, я бы еще каждый вызов recycle() в try...catch обернул:
    Код (Text):
    try { if (pfdoc!=null) pfdoc.recycle(); } catch (NotesException ex) {}

    Надо так:
    Код (Text):
            deptDoc = viewDepts.getFirstDocument();
    while (deptDoc != null) {

    бла-бла...

    Document tmpDoc = viewDepts.getNextDocument (deptDoc);
    deptDoc.recycle();
    deptDoc = tmpDoc;
    }
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    уже не раз говорено - ежели била неизвестно шо делает - луча её наружу вынести
     
  17. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Переписал я с нуля эту функцию.. ошибка осталась.

    Методом сокращения области, при появлении ошибки, обнаружил, что она появляется, когда раскоменчиваешь кусок:
    Код (Text):
    while ( list.hasMoreElements() ) {
    res=null;
    res = (SearchResult)list.next();

    бла-бла...
    }
    При этом в начале функции переменные объявляются:
    Код (Text):
    SearchResult res = null;
    NamingEnumeration list = null;
    А в конце закрываются:
    Код (Text):
    list.close();
    list=null;
    res=null;
    Может кто сталкивался? Обойти не получается, ибо данные из LDAP по другому не достать :(
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    такими кусками ничего непонятно...
    причины неожиданного поведения жвм:
    -очистка объекта во время обращения к нему (кривость кода)
    -попытка закрытие сокетов, а они не могут (не хотят)
    -криво реализованная мульти-нитевость
    -меморилики в нативных библах
     
  19. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Я выложил этот кусок, потому что именно его присутствие приводит к ошибке.

    1. Не похоже, т.к. весь код отрабатывает правильно. Ошибка выскакивает уже после последней строчки финалайза NotesMain, т.е. при терминэйте.
    2. Опять же нет, ибо на момент выскакивания ощибки все сокеты обнулены.
    3. Сложный вопрос. Код не особо сложный, поэтому тоже не похоже.. Хотя возможно какие-то классы, что-то пораждают.
    4. От библиотек отказался и сократил функцию до 5ти функций.
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    1 - ежели мультинитевое - как раз возможно такое
    2 - а как это проверить, разница м.б. на уровне 1 мс (опятьже ежели код не thread safe)
    3 - вот то-то и оно
    4 - тока нативная джава и только ваш код?
     
Загрузка...
Похожие Темы - Java Ldap
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    32
  2. gosteev
    Ответов:
    0
    Просмотров:
    39
  3. Polina
    Ответов:
    0
    Просмотров:
    41
  4. ApplePen
    Ответов:
    0
    Просмотров:
    64
  5. Andrey Kha
    Ответов:
    0
    Просмотров:
    69

Поделиться этой страницей