Сборка мусора в Lotus

Тема в разделе "Lotus + Java + LS2J", создана пользователем vincent_vega, 19 июн 2009.

  1. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    Проблема агентов в Лотусе только одна - нужно писать правильный код и правильно чистить за собой мусор. Если этого не делать, то таки да, будут проблемы с подвисанием сервера. Но если сделать все правильно то проблем не будет.

    Вот нашел, уже писал когда-то пример на этом форуме:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>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();
    }
    }

    }[/CODE]
     
  2. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Извиняюсь за возможно глупый вопрос, а чем это может помочь? Просто я яву начал только учить и возможно много еще не знаю. :)
     
  3. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    нотусёвые объекты достаточно объемны, и сборка мусора вызывается несколько отличным образом от "обычной" jvm
    выше упоминали - размер кучи (да и стека) jvm ограничены (дефолтно - "небольшим" значением), в LS они ограничены только размером свободной памяти процесса (до 2Гб)
     
  4. Кирилл Шваб

    Кирилл Шваб Well-Known Member

    Регистрация:
    30 июн 2006
    Сообщения:
    145
    Симпатии:
    4
    В Java с памятью надо быть аккуратнее, т.к. каждый раз когда выполняется doc = view.getNextDocument(doc), то создается новая переменная, под которую выделяется память.
    Т.е. если в представлении будет 1000 документов, то к концу цикла у тебя будет выделено памяти под 1000 переменных типа Document.
    Поэтому перед очередным присвоением необходимо освобождать память, которую занимает переменная.

    Посмотри в хелпе описание метода getNextDocument - там сказано про освобождение памяти.
     
  5. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Подскажите все ли правильно сделал (по очищению объектов)? вроде как все сделал а памяти отъедает как не знаю кто, за каждый запуск по 5-10% и причем после завершения агенте память не возращается, видно все еще висит в памяти, как решить и что делать уже и не знаю...
     
  6. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Тут почитал не знаю правильно ли понял людей, но есть функция System.gc() которая запускает очистку кучи, стоит ли использовать?
     
  7. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Говорили же, что надо recycle. Везде используется = null, а оно как мёртвому припарка.

    Я в секции finally{ ... } чищу все поля-объекты класса и некоторые объекты в агентах, - особенно SWT-объекты на локале, т.к. не почистишь, в следующий раз агент не запустится.
    И в каждом методе стараюсь смотреть, если объект при выходе из метода не будет использоваться, то стараюсь его грохать (метод recycle + null, если recycle не поддерживается, то просто = null).
    Всё это делаю в основном для объектов собственных классов, для всех Lotus-объектов, поддерживающих recycle и для Java-объектов, содержащих большие объёмы данных, как то коллекции, векторы и т.п.
    Не знаю, может ещё кто-нибудь что-то подскажет.
     
  8. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Код (Text):
                        ntTmp = doc;
    doc = null; <--- если тут делать recycle, то цикл завершается и дальше не идет, причем ошибок ни каких нет
    doc = view.getNextDocument(ntTmp);
    ntTmp.recycle();
     
  9. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Надо делать как в хэлпе написано:
    У меня работает.
     
  10. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    принудительный вызов gc никчему адекватному не приведёт :rolleyes:
    при это не надо забывать, что ИБМ по-своему реализует gc
    освобождение (recycle) нотусёвых объектов крайне желательно, ибо... они (объекты) связаны с нативным кодом, а "такие" объекты могут не освобождаться при сборке
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
  12. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Код (Text):
         while (doc != null) {
    System.out.println
    ("\t" + doc.getItemValueString("Subject"));
    tmpdoc = view.getNextDocument(doc);
    doc.recycle();
    doc = tmpdoc;
    }
    а tmpdoc убивать ненадо?
     
  13. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Не путайте объект и указатель на объект
    <!--shcode--><pre><code class='java'> tmpdoc = view.getNextDocument(doc); //создаём объект для следующего документа и присваиваем его адрес указателю tmpdoc
    doc.recycle(); //утилизируем объект документа, на который указывает doc
    doc = tmpdoc; //присваиваем указателю doc адрес, на который указывает tmpdoc
    // tmpdoc.recycle(); //этим действием будет уничтожен объект, на который указывают и tmpdoc и doc[/CODE]
     
  14. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    если что-то хочешь найти про очистку, то именно выше описанное во всех статьях и пишут..

    а вообще очистка (вплоть до итемов) очень помогает джаве не падать..

    как вы думаете, что будет если сделать так:
    <!--shcode--><pre><code class='java'>doc.replaceItemValue( "test", "1" ).recycle();
    doc.getItemValueString( "test" );[/CODE]а самое главное почему ?! с документом иначе получается..
     
  15. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Не пробовал, но думаю, что:
    - после первой строки ничего особенного не произойдёт, т.к. replaceItemValue возвращает объект, аналогичный NotesItem'у, по значению, который поддерживает recycle;
    - 2-я строка также прекрасно отработает, т.к. она не работает с тем Item-объектом, который был возвращён и ЗАrecycleН, т.е. берётся из дока заново.

    Это то же самое, что в LS получить объект NotesItem, сделать ему Delete, а потом выполнить getItemValue.
     
  16. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    принудительный вызов gc никчему адекватному не приведёт wink.gif

    не соглашусь.. как раз наоборот принудительный вызов очищает память..
    что касается лотуса, то в нем все нормально работает, если мега процесс разбить на подпроцессы и вызывать их последовательно, чередуя с вызовом gc..

    не так давно написали красивый конвейер для выполнения обработки данных, который реализовал выполнение всего трех схем (с контролем эксцепшионов и рестартом с места падения, отчетностью по выполнению), в каждой из которых было по 5-7 действий.. в результате, даже при тотальной чистке объектов все равно не хватало памятульки и где-нибудь вылетало, при чем вылеты были двух типов:
    1. после makeresponce копировалось поле $REF, так оно не копировалось, хотя было в докумиенте - это отлавливаемый эксцепцион (ругалось на то, что объект был удален или рециклен)
    2. где-то произвольно код вылетает и никаких эксцепшионов нет - просто остановка выполнения кода

    так вот, после того, как каждое действие (вызов выполнения) было вынесено в отдельный агент, и после каждого запуска агента-действия, вызывается агент с gc, все стало просто зело предивно работать..
     
  17. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    :D я тоже так думал, однако java-парадигма ломает документ идею лотуса :)
    итем это джава объект, если ему сделать рецикл, то ниточка покоторой можно получить поле из документа изчезнет - ништяк (в плохом смысле)..
    технически выглядит как-будто было сделано removeItem.. поле будет доступно, только поле переполучения документа, если, конечно, было сохранение, правда клево ?!..

    Добавлено: тут не ясно что имеется в виду, т.к. неизвесно как там в этой доминге все устроено в плане утилизации..
     
  18. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Kee_Keekkenen
    "Ну... значит моя версия была ошибочной" &copy; :)
     
Загрузка...
Похожие Темы - Сборка мусора Lotus
  1. erhe
    Ответов:
    2
    Просмотров:
    2.161
  2. sasha465
    Ответов:
    1
    Просмотров:
    2.153

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