High memory usage by agent

Forum destiné aux questions sur le développement : Formules, LotusScript, Java ...

High memory usage by agent

Messagepar seroa » 10 Mai 2010 à 09:47

Bonjour à tous,

J'ai le message de Warning suivant sur la console :

@@@ Agent memory usage (9) percentage of total
High memory usageby agent 'monagent' in database 'mabase.nsf'. Threshold level high.

Mon agent parcours une vue puis construit du code html pour faire un planning. Plus j'ai de lignes dans le planning, plus le pouircentage de mémoire est elevé.

Avez-vous déjà eu ce genre de message ? Voila la classe java de mon agent

Est-ce que vous voyez quelque chose qui pourrait prendre beucoup de ressources svp ?

Code : Tout sélectionner
public class PlanningBuild extends AbstractDominoAgent {

   private Document context;
   
   public static final String FIELD_OFFICE     = "office";
   public static final String FIELD_MONTH      = "month";
   public static final String FIELD_YEAR       = "year";
   
   public PlanningBuild(final Session session, final Document context) {
      super(session);
      this.context = context;
   }

   public void run() throws NotesException {
      try{
         Database db = context.getParentDatabase();
         try {         
            String month = context.getItemValueString(FIELD_MONTH);            
            String year =  context.getItemValueString(FIELD_YEAR);
            String office = context.getItemValueString(FIELD_OFFICE);

            int m = Integer.parseInt(month) - 1 ;
            int y = Integer.parseInt(year);
            
            String vwName = "($Planning)";
            View view = db.getView(vwName);
            try {
               if (null == view) {
                    throw new NotesException(NotesError.NOTES_ERR_VIEW_MISSING, "view " + vwName + " not found");
               }

               GregorianCalendar gc = new GregorianCalendar();
               HolidayFactory factory = new HolidayFactory(db, office, year);
               Vector holidays = new Vector();
               holidays = factory.getHolidaysCountry();
               Collections.sort(holidays);
               Vector holidaysMonth = new Vector();

               for (int i = 0; i < holidays.size(); i++) {
                  Date d = (Date) holidays.elementAt(i);
                  gc.setTime(d);
                  if (gc.get(Calendar.MONTH) == m) {
                     Integer day = new Integer(gc.get(Calendar.DAY_OF_MONTH));
                     holidaysMonth.addElement(day);
                  }
               }
                  
               Planning planning = new Planning(y,m, holidaysMonth, db.getFileName());

               String index = office + "/" + year + "/" + month;

               ViewEntryCollection vec = view.getAllEntriesByKey(index,true);
               try {
                  ViewEntry entry = vec.getFirstEntry();
                  try {
                     while (entry != null) {
                        ViewEntry nextEntry = vec.getNextEntry(entry);
                        Vector line = new Vector();
                        line = entry.getColumnValues();
                        String name = String.valueOf(line.elementAt(1));
                        
                        PlanningPerson person;
                        if (!planning.personExist(name)) {
                           person = new PlanningPerson(planning.getYear(), planning.getMonth(), name, holidaysMonth, db.getFileName());
                           planning.addPerson(person);
                        } else {
                           person = planning.searchPlanningPerson(name);
                        }
                        if (Integer.parseInt(String.valueOf(line.elementAt(7))) == 1) {
                           if (String.valueOf(line.elementAt(4)).equalsIgnoreCase(planning.getSMonth())) {
                              String d = String.valueOf(line.elementAt(3));
                              if (!person.dayExist(d)) {
                                    person.addDay(d);
                                    person.addDuration(String.valueOf(line.elementAt(6)));
                                    person.addType(String.valueOf(line.elementAt(8)));
                                    person.addId(String.valueOf(line.elementAt(10)));
                              }
                           }
                        } else {
                           Vector months = new Vector();
                           months = (Vector) line.elementAt(4);
                           Vector days = new Vector();
                           days = (Vector) line.elementAt(3);
                           Vector durations = new Vector();
                           durations = (Vector) line.elementAt(6);
                           String type = String.valueOf(line.elementAt(8));
                           String docId = String.valueOf(line.elementAt(10));
                           for (int i = 0; i < days.size(); i++) {
                              String currentMonth = String.valueOf(months.elementAt(i));
                              if (currentMonth.equalsIgnoreCase(planning.getSMonth())) {
                                 String d = String.valueOf(days.elementAt(i));
                                 if (!person.dayExist(d)) {
                                    person.addDay(d);
                                    person.addDuration(String.valueOf(durations.elementAt(i)));
                                    person.addType(type);
                                    person.addId(String.valueOf(docId));
                                 }
                              }
                           }
                        }   
                           
                        entry.recycle();
                        entry = nextEntry;
   
                     }   
                     
                     String html = planning.extractPlanningHTML();   

                     context.replaceItemValue("planning", html);
                     
                  } finally {
                     dominoRecycle(entry);
                  }
               } finally {
                  dominoRecycle(vec);
               }
            } finally {
               dominoRecycle(view);
            }
               
         } finally {
            dominoRecycle(db);
         }
      } catch (NotesException e) {
         e.printStackTrace();
      }
      
   }

}


Merci.
seroa
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 304
Inscrit(e) le : 08 Nov 2007 à 08:36
Localisation : Mâcon

Messagepar amahi » 10 Mai 2010 à 14:17

C'est tres propre...
Au niveau Planning et PlanningPerson c'est aussi du Domino? Tu fait le menage correctement au niveau de ces classes ?
@Novaliance
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

Messagepar Michael DELIQUE » 10 Mai 2010 à 20:19

salut

je ne sais pas en quelle version tu es, mais jusqu'a la 7 (pas testé pour la 8 ) quand ton agent dépasse est certain nombre d'objets traité, ta mémoire est saturé.

il faut recyclé a mort et encore...
Dernière édition par Michael DELIQUE le 10 Mai 2010 à 21:56, édité 1 fois.
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar Aquanotes » 10 Mai 2010 à 20:31

Salut,

Pour ma culture , tu le vois ou ton message ? ddm ? j'ai eu il y a qq temps des pbs de mémoire avec du java et je n'ai jamais vu ce message dans la console.
*** une 3ème année sans nicotine qui démarre :danse001: ***
Aquanotes
Posteur habitué
Posteur habitué
 
Message(s) : 295
Inscrit(e) le : 16 Déc 2004 à 12:13
Localisation : Niort

Messagepar seroa » 11 Mai 2010 à 07:57

Bonjour à tous,

amahi : Planning et PlanningPerson ne sont pas des objets domino. Je vais voir pour les recycler eux aussi.

Mickael : Je suis en version 7, je ne recycle que mes objets domino, c'est peut être pour ça que j'ai ses messages.

Aquanotes : Ces messages n'apparaissent pas dans la configuration standard, pour les voir, ouvre events4.nsf avec notes. Tu arrives sur Monitoring Configuration. Tu vas dans DDM Configuration, DDM Probes.
Dans la partie Application Code, tu as la possibilité d'activer ou désactivé les messages selon leur type et leur importance.

Merci.
seroa
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 304
Inscrit(e) le : 08 Nov 2007 à 08:36
Localisation : Mâcon

Messagepar Michael DELIQUE » 11 Mai 2010 à 08:00

petite précision un certain nombre d'objet "NOTES"

genre parcourir une vue avec 10 000 documents
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar amahi » 11 Mai 2010 à 09:09

Quand je vois ça:
Planning planning = new Planning(y,m, holidaysMonth, db.getFileName());

Je me dit que l'objet Planning recupere de l'information dans une base Notes, mais je me trompe peut etre.
Si c'est le cas, bien penser à recycler à la fin du traitement.
amahi
Empereur des posts
Empereur des posts
 
Message(s) : 1032
Inscrit(e) le : 08 Jan 2007 à 16:57
Localisation : Region parisienne

Messagepar seroa » 11 Mai 2010 à 10:18

Non, en fait le db.getFileName(), me sert juste à avoir le nom de la base pour ensuite créer des liens en HTML qui pointerons vers des documents de ma base notes.
seroa
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 304
Inscrit(e) le : 08 Nov 2007 à 08:36
Localisation : Mâcon

Messagepar Aquanotes » 11 Mai 2010 à 18:48

Merci.
*** une 3ème année sans nicotine qui démarre :danse001: ***
Aquanotes
Posteur habitué
Posteur habitué
 
Message(s) : 295
Inscrit(e) le : 16 Déc 2004 à 12:13
Localisation : Niort

Messagepar Smicky » 19 Mai 2010 à 18:57

Sinon tu peux utiliser les outils d'analyse de heap java, je pense que ceux qu'IBM fournis doivent pouvoir se pluguer sur la JVM Domino. Ca te permettra, pendant le run de ton agent, de voir les objets créés etc...
Smicky
Posteur habitué
Posteur habitué
 
Message(s) : 232
Inscrit(e) le : 09 Déc 2006 à 15:27
Localisation : Paris


Retour vers Développement

cron