2016-05-12 8 views
2

Ich bin meine Anwendung in Tomcat ausgeführt und ich bekomme OutofMemory-Fehler aufgrund Char-Array. Ich habe Tomcat's bug report über diesen Fehler erwähnt. Jetzt habe ich mich entschlossen org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER = true in catalina.propertiesWirkung von LIMIT_BUFFER = True-Flag in Tomcat

Meine Frage ist,

1.What sind die Nebenwirkungen nach der Einstellung dieses Wertes hinzufügen?

2.Was sind die Werte, die gelöscht werden (Werden Werte gelöscht wie Sitzungs-ID)?

Antwort

1

Laut Dokumentation auf Apache Tomcat Configuration,

org.apache.jasper.runtime. BodyContentImpl.LIMIT_BUFFER

Wenn das stimmt, jeder Tag-Puffer, der über org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE erweitert wird und ein neuer Puffer der Standardgröße erstellt zerstört werden.

Wenn nicht angegeben, wird der Standardwert false verwendet.

Die Dokumentation bezieht sich eindeutig auf Tag-Puffer.

Vom source reference,

Jedes Mal, wenn Sie verwenden, um einen taglib Tag auf Ihrer JSP Seite wie einen <c:set>JSTL Tag oder wirklich jeden Tag (mit Ausnahme der <jsp:*>-Tags, da sie anders nicht wirklich „tags“ als solche und behandelt werden), wird ein Zeichenpuffer eingerichtet, um den Body dieses Tags zu erhalten. Die Servlet/JSP Spezifikationen verlangen, dass es keine Grenze für die Größe eines Tag-Körpers gibt, so dass dieser Puffer unbegrenzt wachsen kann. Wenn Sie ein Tag in ein anderes Tag verschachteln, wird zusätzlich ein zusätzlicher Puffer für das verschachtelte Tag usw. eingerichtet. Diese Puffer werden alle in einem Stapel im PageContext verwaltet, aber niemals wirklich dereferenziert. Aus diesem Grund bleiben alle diese Zeichenpuffer bestehen und werden von späteren Anfragen wiederverwendet.

Was LIMIT_BUFFER tut, ist Tomcat zu zwingen, den Puffer vor jeder Verwendung zu verwerfen, wenn es größer als die Standardgröße (512 Zeichen) und weisen Sie einen neuen Puffer der Standardgröße (die natürlich wachsen können, wenn es nicht genug mit dem Tag-Körper umgehen).

Wann ist dies relevant

Dies ist vor allem ein Problem, wenn Sie Tags mit sehr großen Körpern haben. Beispiel: 400 Worker-Threads mit einer durchschnittlichen Tag-Schachtelungstiefe von 3 = 400 * 3 * 512 = ~ 614 KB. Aber sagen Sie, Sie verwenden Kacheln und Sie haben eine Seite, die 1 MB groß und 5 Ebenen von Vorlagen ist. Dann sehen Sie sich 2 GB Speicher an, die für immer reserviert sind. Und Sie müssen den schlimmsten Fall in Betracht ziehen, da schließlich jeder Worker-Thread diese eine große Seite mindestens einmal und ohne LIMIT_BUFFER bedient hat. Sobald diese Puffer groß sind, werden sie niemals kleiner.

Wahrscheinlich scheint Tomcat die riesigen Tags-Daten zwischenzuspeichern und zu speichern. Wenn die Seiten in Ihrer Anwendung wirklich groß sind, kann das auf unbestimmte Zeit wachsen. Das Setzen dieser Eigenschaft wird wahrscheinlich keine vollständigen Tags/HTML-Daten zwischenspeichern. Große JSP-Seitenanforderungen können Speicher füllen.

Laut Dokumentation scheint es wie session id Caches.

This wurde das Problem gemeldet, aber scheint wie behoben.

Wenige weitere Daten zu lesen here, here.