Hallo OPC-Gemeinde,
in einer Client-Anwendung, die als Dienst zu laufen hat, habe ich mehrere OPC-Server zu Messgeräten zu konnektieren, die jeweils über sehr viele Items verfügen.
Die Messgeräte müssen zu jeder Messung extra befehligt werden.
Aus diesem Grund werden je Messung unterschiedliche Items verlangt und zu einer Messung eben nur die zu einem bestimmten Gerät angelegt. Benutzt werden die Items der Klasse SODACItemDefault. Die bis zu 4096 Messwerte werden in ein Array vom Typ VT_I4|VT_ARRAY abgelegt. Nach einer Messung werden die Items deaktiviert und sollen gelöscht werden und zur nächsten Messung werden wieder andere Items erzeugt und konnektiert. Das Neuerzeugen erfolgte mit addItem auf einem Group-Item. Das Deaktivieren erfolgte mit removeLeaf.
Funktionieren tut es, das Problem ist jedoch, dass der Speicherbedarf des Clients dabei ständig ansteigt, was für ein Dienstporgramm, das Tag und Nacht laufen soll, ungünstig ist. Bei removeLeaf werden nur ca. 30% vom Speicherbedarf eines Items wieder freigegeben. Es wundert mich, dass es zum addItem keine deleteItem-Methode gibt, und ein einfaches delete führt unter Umständen zum Absturz des Clients.
In einem anderen Versuch verzichtete ich auf das ständige Neuerzeugen und Löschen der Items, stattdessen erzeugte ich von vornherein alle Items und ließ sie ständig aktiv. Das führte zum Erfolg des konstant bleibenden Speicherbedarfs (getestet über ein Wochenende hinweg), brachte jedoch den Nachteil einer hohen CPU-Belastung. Dafür konnektierte ich die vorübergehend benötigten Items selektiv mit der start-Methode und deaktivierte sie nach der Messung wieder mit der disconnect-Methode. Leider bekam ich untrüglich den Eindruck, dass der Speicherbedarf daraufhin wieder ständig steigend war - ca. 0,3 MB pro Stunde.
Am Democlient von Softing habe ich nicht im geringsten festgestellt, dass Speicher freigegeben wird, wenn man Items großer Arrays löscht.
Was kann ich gegen wachsenden Speicherbedarf tun?
Habe ich vielleicht etwas übersehen?
Nun bin ich gespannt Ihre Antworten!
Mit freundlichen Grüßen
Heinz-Josef Lüther