Page 1 sur 1

High memory usage by agent

MessagePublié: 10 Mai 2010 à 09:47
par seroa
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.

MessagePublié: 10 Mai 2010 à 14:17
par amahi
C'est tres propre...
Au niveau Planning et PlanningPerson c'est aussi du Domino? Tu fait le menage correctement au niveau de ces classes ?

MessagePublié: 10 Mai 2010 à 20:19
par Michael DELIQUE
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...

MessagePublié: 10 Mai 2010 à 20:31
par Aquanotes
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.

MessagePublié: 11 Mai 2010 à 07:57
par seroa
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.

MessagePublié: 11 Mai 2010 à 08:00
par Michael DELIQUE
petite précision un certain nombre d'objet "NOTES"

genre parcourir une vue avec 10 000 documents

MessagePublié: 11 Mai 2010 à 09:09
par amahi
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.

MessagePublié: 11 Mai 2010 à 10:18
par seroa
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.

MessagePublié: 11 Mai 2010 à 18:48
par Aquanotes
Merci.

MessagePublié: 19 Mai 2010 à 18:57
par Smicky
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...