Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: inu am 28.08.06 - 11:37:39

Titel: C++-Task ist speicherhungig
Beitrag von: inu am 28.08.06 - 11:37:39
Hallo Leute,

habe einen Task mittels API (C++) geschrieben, der periodisch Aktivitäten ausführt. Mit jedem Ausführen sehe ich im Task-Manager von Windows, dass mehr und mehr Speicher genutzt/benötigt wird.
Habt ihr so etwas auch festgestellt? Wie kann man das ändern. Zumal die noteseigenen Task beträchtlich weniger an Hauptspeicher benötigen, als mein kleiner Testtask.

Vielen Dank
Titel: Re: C++-Task ist speicherhungig
Beitrag von: 0xse am 28.08.06 - 11:41:49
C++ hat keinen Garbage Collector. Gibst du den verwendeten Speicher auch immer wieder ordentlich frei? :)
Titel: Re: C++-Task ist speicherhungig
Beitrag von: flaite am 28.08.06 - 11:44:45
Du dürftest einen Memory Leak programmiert haben.
Ich bin nicht so der C-Programmierer. Aber das hört sich extrem so an.
Vermutlich gibts da irgendwelche Analysetools zu.
Wenn man mit C arbeitet, muß man sich eben mit Speicher-Allokation beschäftigen.

Gruß Axel
Titel: Re: C++-Task ist speicherhungig
Beitrag von: inu am 28.08.06 - 11:46:58
@Oxse: So viele Möglichkeiten bietet doch die API nicht.
Titel: Re: C++-Task ist speicherhungig
Beitrag von: eknori (retired) am 28.08.06 - 11:52:12
machst du irgendwelche NSFSearch Operationen ?

Wenn ja, kannst du mal die relevante Stelle im Code posten ?
Titel: Re: C++-Task ist speicherhungig
Beitrag von: 0xse am 28.08.06 - 11:54:12
Die API, mag sein, aber C++ ^^ Triviales Beispiel:

void *p = NULL;

p  = new cIrgendwas;

[...code...]

p  = new cIrgendwasAnderes;

Und schon hast du ein cIrgendwas Objekt im Speicher rumfliegen. Vergesse nie das delete :)

Ansonsten, hier kannste deinen Code posten. Dann kann ich dir vlt sagen wo der Fehler ist :)

http://mandrill.fuxx0r.net/c++/paste
Titel: Re: C++-Task ist speicherhungig
Beitrag von: DerAndre am 28.08.06 - 11:58:37
Selbst sowas triviales wie ein delete sollte auch die API bieten. Sonst wäre sie Unbrauchbar!


P.S. gibt es an der Stelle auch Konstruktoren und Destruktoren?

André
Titel: Re: C++-Task ist speicherhungig
Beitrag von: inu am 28.08.06 - 14:47:00
@eknori, @Oxse:

Code
int main(int argc, char *argv[])
{	LNNotesSession		Session;
	LNServerAddin		Addin;
	LNDatabaseArray		DBArray;
	LNDatabase			Database;
	LNAgentArray		AgentArray;
	LNAgent				Agent;
	LNString			Ausgabe, buffer, taskname, Name;
	int					AgentCount;
	LNMessageQueue		mqueue;
	int					ProgramStatus = 0;
	int a,b;
	LNSetThrowAllErrors(TRUE);
	try
	{	Session.Init(argc, argv);
		Session.GetServerAddin("MyTask","MyTask", &Addin);
		Addin.AppendLogMessage("MyTask gestartet");
		taskname = Addin.GetDefaultStatusLineTaskName();
		buffer = TASK_QUEUE_PREFIX;
		buffer.Append(taskname);
		Session.CreateMessageQueue( buffer, &mqueue);
		while (!Addin.Idle())
		{	if (Addin.HaveSecondsElapsed(600) )
			{	try
				{	Session.GetDatabases( &DBArray, "", "", LNGETDBFLAGS_DATABASES + /*LNGETDBFLAGS_TEMPLATES +*/ LNGETDBFLAGS_RECURSE);
					Ausgabe =	"MyTask: ";
					Ausgabe	+=	LNString(DBArray.GetCount());
					Ausgabe += (" Datenbanken gefunden");
					Addin.AppendLogMessage(Ausgabe);
					AgentCount = 0;				
					// alle DBs auslesen		
					for (a=0;a<int(DBArray.GetCount());a++)
					{	Database	= DBArray.operator[]( a );
						Database.Open();
						Database.GetAgents( &AgentArray, TRUE );
						Addin.AppendLogMessage(Database.GetTitle());
						if (AgentArray.GetCount() > 0)
						{	for (b=0;b<int(AgentArray.GetCount());b++)
							{	Agent	= AgentArray.operator [] (b);
								Agent.Open();
								if (Agent.GetIsEnabled())
								{	Name	= " ---> ";
									Name    += Agent.GetName();
									Addin.AppendLogMessage(Name);
									AgentCount++;
									//MyArray[0].AgentName = Agent.GetName();
								}
								Agent.Close();
								//Agent.~LNAgent();
							}
						}
						AgentArray.~LNAgentArray();
						Database.Close();
						Database.~LNDatabase();
					}
					Ausgabe = "MyTask: Suche beendet (";
					Ausgabe += LNString(AgentCount);
					Ausgabe += " aktive Agenten gefunden)";
					Addin.AppendLogMessage(Ausgabe);
					DBArray.~LNDatabaseArray();
				}
				catch (LNSTATUS lnerror)
				{	char ErrorBuf[LNERROR_MESSAGE_LENGTH];
					LNString errormessage;
			        LNGetErrorMessage(lnerror, ErrorBuf, LNERROR_MESSAGE_LENGTH);
					errormessage = "dbbAdmin -> Fehler: ";
					errormessage.Append(ErrorBuf);
					Addin.AppendLogMessage(errormessage);
			    }
			}
		}
    } 
	catch (LNSTATUS lnerror)
    {	ProgramStatus = 1;
		Ausgabe = "MyTask: Es ist ein Fehler aufgetreten - ";
		Ausgabe.Append(lnerror);
		Addin.AppendLogMessage(Ausgabe);
	}
	if (Addin.ShouldAddinTerminate())
	{	
	}
	Addin.AppendLogMessage("ddbAdmin beendet");
	Session.Term();
	return(ProgramStatus);

Des weiteren weiß ich auch nicht, wie ich einen TELL-Befehl auf meinen Task ausführen kann. Vielleicht habt ihr ja auch dazu einen Hinweis.

Vielen Dank
Titel: Re: C++-Task ist speicherhungig
Beitrag von: RHolighaus am 29.08.06 - 12:14:33
Die C++ API von Domino hat einen eigenen Garbage Collector.
Nach einer gewissen Zeit sollte sich der Speicher auf ein bestimmtes Maß begrenzen - wenn ansonsten kein Fehler existiert.

Die Garbage Collection kannst Du beeinflussen indem Du das Fester der Dominokonsole verkleinerst, dann wird der Speicher bereinigt.
Titel: Re: C++-Task ist speicherhungig
Beitrag von: inu am 20.09.06 - 06:43:38
@Rolf:

Ja, beim Verkleinern geht der Speicher am teilweise unter 1MByte zurück. Das ist großartig! Dennoch: Bleibt die Konsole offen oder wird über die Livekonsole ein Befehl ausgeführt, wird der Speicher (nach mehreren TELL-Befehlen habe ich bis zu 200 MByte belegt) auch nach angemessener Zeit nicht freigegeben.

Wie kann ich das noch beeinflussen?