Der Befehlt ließe sich schon deaktivieren aber der ist so alt, den gabs schon in der Java version und bisher hat er nie Probleme gemacht 😅, wenn dann ist es eher mit der Anzahl der Plugins als Nebenerscheinung dazu gekommen.
Naja, in der Java Version war alles wirklich pures Java, kein fragiles Bindeglied (JNI) zw. API und Spiel. Die meisten API-Objekte (zB "Player") waren die tatsächlichen spielseitigen Objekte (nur halt mit Zusatzfunktionen, die für die API bereitgestellt werden). Da war das Risiko für solche Crashes ohne Exception oder konkrete Fehlermeldung wirklich nahe 0 ![]()
JNI ist hingegen leider schon sehr pingelig und gleichzeitig gnadenlos. Jeder Fehler auf nativer Seite (während des API-Aufrufs) führt unweigerlich zu einem SIGSEGV oder stillen Crash (und da ist dann meist sehr schwer abzuleiten, wo genau der Crash entsteht). Darüberhinaus können Objekte nicht so leicht zwischen nativer und Java Seite ausgetauscht werden (sondern müssen als spezielle Referenzen registriert werden, davon jedoch gibts auch Limits usw)... es ist leider eine sehr breite Fehleranfälligkeit gegeben ![]()
---
Bei genauerer Betrachtung der Screenshot-Funktion könnte ich mir aber eine potenzielle Fehlerquelle vorstellen: Da hier das Objekt in einem Callback erzeugt wird, also nicht direkt Teil des Rückgabewertes ist, wird die Referenz darauf nicht automatisch von JNI aufgeräumt, sondern muss manuell freigegeben werden (was das Spiel an der Stelle nicht macht). JNI kann automatisch nur 16 lokale Referenzen handeln. Zwar sollte es danach nicht crashen, aber da hier auch relativ große Objekte dran gekoppelt sind (BufferedImage) die nicht freigegeben werden können könnte ich mir potenziell vorstellen, dass ein GC beim Durchlauf vll auf Probleme stößt (weshalb der Crash meist später beim GC passiert). Ist nur eine Vermutung, aber ich werde diesen Bug auf jeden Fall mit dem nächsten Update beheben. Und ich werde auch alle anderen Stellen, an denen das Spiel mit Callbacks arbeitet, einmal prüfen, da hier theoretisch dasselbe Problem vorliegen könnte (wobei die Screenshot-Funktion vmtl. aufgrund der großen Daten am problematischsten ist) ![]()
Hmm spontan wüsste ich nicht welches Plugin öfter neue Threads generieren sollte. In einem log von vorgestern wo es zwischen den Neustarts (3:00-17:00 GMT) kein crash war, ist Create new JNIEnv 192 mal zu finden.
Das ist schon auffällig viel
Die Meldung kommt aber immer dann, wenn ein neuer Thread eine JNIEnv benötigt... es gibt da eigentlich auch keinen Mechanismus, wodurch ein Thread "vergessen" wird o.ä. (die Thread ID ist ja auch immer eine andere).
Ich schaue mal, ob ich da evtl. mehr Debug-Möglichkeiten einbauen kann (damit man evtl. sieht, welcher Thread das jeweils ist).
Ja es ist schwierig herauszufinden, ich hab schon alles an logging aktiviert aber es kommt kein hint auf den Verursacher.
Du könntest evtl. zusätzlich auch einmal folgende Einstellung zur server.properties hinzufügen:
Plugins_JNIVerbose=True
Dann werden zusätzliche Meldungen ausgegeben (gerade auch in dem oben genannten Fall, also wenn zu viele Local Refs vorhanden sind, müsste JNI dann eigentlich was ausgeben). Könnte den Log aber etwas zuspammen.
Ggf. könntest du auch Plugins_JNIXcheck=True hinzufügen, das könnte aber etwas Overhead mit sich bringen. Damit führt Java zusätzliche Validierungen und Prüfungen durch. Wichtiger wäre aber vmtl. obige JNIVerbose Einstellung ![]()