Работя с Domino сървър и разработвам java агенти. Обикновено поставям външни jar файлове в библиотеката със скриптове, но периодично получавам OutOfMemory. Извлякох jar от библиотеката със скриптове в jvm/lib/ext. Мога да получа класове чрез ClassLoader, но не мога чрез инструкция за импортиране. Какво трябва да направя, за да работи чрез импортиране?
Какво трябва да направя, за да получа класове чрез оператор за импортиране от външни буркани в Domino Designer?
Отговори (2)
- Затворете клиента и дизайнера на Lotus Notes.
- Поставете JAR във вашия локален jvm/lib/ext.
- Отворете клиента и дизайнера на Lotus Notes.
Сега можете да импортирате класовете.
Всъщност можете изрично да добавите буркана към Java Agent. Имайте предвид, че Java Agent няма име на пакет по подразбиране и ще трябва да цитирате правилното име на пакета, когато цитирате пакета в оператора за импортиране. Импортирането на jar в агенти е описано тук, а за версия 8.5 тук и тук
Освен това подозирам, че не почиствате изрично своите java обекти. Връзката между JVM и паметта на Domino е "слаба". Така че трябва да направите свое собствено събиране на боклук на Domino обекти, за да поддържате паметта на сървъра чиста. Това все още е черна магия за мен, но моето разбиране е, че въпреки че агентите трябва да "съдържат" сесията и след това да освободят паметта при прекратяване, обектите на Domino, които не са рециклирани правилно, могат да изтощават паметта на Domino. По-долу са моите прости съвети за поддържане на паметта ви чиста:
1/ Съхранявайте обекта на сесията в обект за обвивка. Създайте клас, който има обекта на Domino session в него (нарекох го SessionWrapper). След това декларирайте обекта SessionWrapper само в рамките на метода NotesMain, не го декларирайте на ниво клас. Този клас SessionWrapper ще трябва да има свой собствен метод за рециклиране, който извиква Session.recycle(), и ще трябва да го извикате в края на NotesMain. Причината за това е обяснена в точка №2. Ако не извиквате никакви други методи в рамките на NotesMain, тогава наистина нямате нужда от тази обвивка. Вижте точка #4 относно рециклирането на сесията.
2/ Предайте SessionWrapper на всички методи, където се нуждаете от достъп до Domino. По принцип вие предавате сесията в този обвиващ клас като параметър. Това е така, защото не искаме да декларираме обекта на сесията на ниво клас. Това не е идеално, но ще предотврати изтичането на памет, причинено от поддържането на класа на сесията на ниво клас.
3/ Агресивно рециклиране. Това никога не е имало смисъл за мен, докато не видях този примерен цикъл
ViewEntryCollection vec = view.getAllEntries();
ViewEntry ve = vec.getFirstEntry();
While (ve!=null) {
ViewEntry veNext = vec.getNextEntry(ve);
// do stuff
ve.recycle;
ve = null;
ve = veNext;
}
Вижте как обектът "ve" се рециклира и как veNext получава следващия обект. По принцип трябва да рециклирате всеки обект, след като приключите работата с него, методите "getNext" всъщност не рециклират обекта в паметта на паметта на Domino, ако не го рециклирате, той остава сирак и Domino няма да изчисти и сървърът в крайна сметка ще изчерпи паметта си за Domino обекти. Имайте предвид, че не рециклирам veNext. Не ми трябва, защото присвоявам ve => veNext. "ve" ще има връзка към същия обект на Domino и аз извиквам recycle ve в края на цикъла. От това можете да видите, че много Java обекти могат да сочат към един и същ обект на екземпляр на Domino в задната част. Ако се опитах да извикам veNext.recycle след ve.recycle, щях да получа грешка „Обектът е премахнат или рециклиран“.
4/ Повторна сесия в края на NotesMain. Уверете се, че извиквате SessionWrapper.recycle() в края на NotesMain, за да сте сигурни, че освобождавате този бит памет обратно към сървъра.
5/ Уверете се, че предоставяте достатъчно памет за JVM на сървъра. Вижте тази техническа бележка. Също така имайте предвид "HTTPJVMMaxHeapSizeSet=1", което е странна настройка, за да се гарантира, че настройките на паметта "залепват". Повече за това тук.
В продължение на много години IBM не предоставя задачите за вътрешно почистване на обекти, които са толкова отчаяно необходими, за да се премахнат тези допълнителни разходи за разработчиците. След това от вас се изисква изрично да освободите памет, което също е удар на производителността, но е необходим компромис за стабилност. Тези точки в никакъв случай не са изчерпателни, но открих, че стабилността с агенти и сървлети се подобрява значително при спазване на тези правила.
Имам малък проблем с динамичната промяна на динамичната тема на бутон. От друга публикация се научих да използвам:
Технически това работи, докато не прекарам курсора на мишката - тогава бутонът се връща към темата за данни "c". Има ли по-добър начин за динамична промяна на темата?
- person vexan   schedule 05.08.2012