Ist es in Ordnung, eine Bibliotheksdatei direkt nach dem Laden mit der Funktion system.loadLibrary() zu löschen? Hier ist das Szenario ...Löschen einer temporären Datei nach dem Laden in JVM
Wir verwenden JNI, um das DomainSocket-Dienstprogramm zu verwenden, das in C-Sprache geschrieben wird, um von einer Java-App aus aufzurufen. Wir packen die .SO-Dateien in das gleiche jar und verwenden ein Dienstprogramm, um eine temporäre Datei im Dateisystem zu erstellen und laden Sie die .SO mit der loadLibrary-Funktion. Wir verwenden die Datei File.createTempFile(), die eine eindeutige temporäre Datei erstellt. Wir verwenden die Datei deleleOnExit(), um die temporäre Datei beim Herunterfahren von JVM zu löschen.
In einer eigenständigen Anwendung auf JVM funktioniert das einwandfrei. Aber wir haben ein Problem bei der Bereitstellung in Web-Containern wie Tomcat, da mehrere Anwendungen auf derselben JVM ausgeführt werden können. Zunächst wird für jede bereitgestellte App eine temporäre Datei erstellt. Das eigentliche Problem ist, dass die temporäre Datei nicht gelöscht, sondern neu erstellt wird, wenn die App gestoppt und gestartet oder erneut bereitgestellt wird. Alle temporären Dateien werden gelöscht, wenn die JVM heruntergefahren wird (Tomcat neu gestartet).
Wir experimentierten mit einer Lösung, um die temporäre Datei nach der loadLibrary() zu löschen. Dies scheint gut zu funktionieren. Eine neue temporäre Datei wird beim Neustart erstellt und direkt nach dem Laden gelöscht.
Wollte überprüfen, ob jemand einige Hinweise/Vorschläge hat?
Wir möchten nicht den common/lib-Mechanismus verwenden, um die .SO-Dateien nur einmal pro Container zu laden, da wir diese .SO-Dateien Teil der Anwendung machen wollen.
Auf welches Betriebssystem beziehen Sie sich, wenn Sie sagen, dass Bibliotheken zu jeder Zeit entladen werden können? – apangin
@apangin Kein bestimmtes Betriebssystem, das ich im Sinn hatte. Aber es gibt keine Anforderung von POXIX usw., dass der Code geladen bleibt und daher das plattenbasierte Artefakt frei verschwinden kann. Ich würde erwarten, dass "undefined behavior" das Ergebnis des Ladens ist und dann eine shared-library von der Platte löscht. –
Nun, ich weiß nicht, Betriebssysteme (zumindest unter den von Oracle JDK unterstützt), die zum Absturz einer Anwendung führen, wenn eine gemeinsame Bibliothek gelöscht wird. Normalerweise verweigert das Betriebssystem das Löschen (Windows) oder hebt den Dateinamen auf (Linux), wobei die Dateidaten auf dem Datenträger verbleiben. Das Entfernen der Datei wirkt sich nicht auf die Speicherzuordnungen dieser bereits geöffneten Datei aus. – apangin