Author: markt Date: Thu Sep 3 14:00:09 2015 New Revision: 1701027 URL: http://svn.apache.org/r1701027 Log: Experiment with a static cache of C2BConverter objects rather than a per request cache that gets cleared every time the request switches to async mode.
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java tomcat/trunk/java/org/apache/catalina/connector/Response.java tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1701027&r1=1701026&r2=1701027&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Sep 3 14:00:09 2015 @@ -308,7 +308,6 @@ public class CoyoteAdapter implements Ad // Clear converters so that the minimum amount of memory // is used by this processor request.clearEncoders(); - response.clearEncoders(); } } return success; @@ -409,7 +408,6 @@ public class CoyoteAdapter implements Ad // Clear converters so that the minimum amount of memory // is used by this processor request.clearEncoders(); - response.clearEncoders(); } } Modified: tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java?rev=1701027&r1=1701026&r2=1701027&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java Thu Sep 3 14:00:09 2015 @@ -34,6 +34,7 @@ import org.apache.tomcat.util.buf.B2CCon import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.C2BConverter; import org.apache.tomcat.util.buf.CharChunk; +import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.res.StringManager; /** @@ -49,10 +50,14 @@ public class OutputBuffer extends Writer private static final StringManager sm = StringManager.getManager(OutputBuffer.class); - // -------------------------------------------------------------- Constants - public static final int DEFAULT_BUFFER_SIZE = 8*1024; + /** + * Encoder cache. + */ + private static final ConcurrentHashMap<Charset, SynchronizedStack<C2BConverter>> encoders = + new ConcurrentHashMap<>(); + // ----------------------------------------------------- Instance Variables @@ -117,12 +122,6 @@ public class OutputBuffer extends Writer /** - * List of encoders. - */ - protected final ConcurrentHashMap<Charset, C2BConverter> encoders = new ConcurrentHashMap<>(); - - - /** * Current char to byte converter. */ protected C2BConverter conv; @@ -234,6 +233,7 @@ public class OutputBuffer extends Writer if (conv != null) { conv.recycle(); + encoders.get(conv.getCharset()).push(conv); conv = null; } @@ -242,14 +242,6 @@ public class OutputBuffer extends Writer /** - * Clear cached encoders (to save memory for async requests). - */ - public void clearEncoders() { - encoders.clear(); - } - - - /** * Close the output buffer. This tries to calculate the response size if * the response has not been committed yet. * @@ -567,11 +559,16 @@ public class OutputBuffer extends Writer } final Charset charset = B2CConverter.getCharset(enc); - conv = encoders.get(charset); + SynchronizedStack<C2BConverter> stack = encoders.get(charset); + if (stack == null) { + stack = new SynchronizedStack<>(); + encoders.putIfAbsent(charset, stack); + stack = encoders.get(charset); + } + conv = stack.pop(); if (conv == null) { conv = createNewConverter(charset); - encoders.put(charset, conv); } } @@ -635,6 +632,10 @@ public class OutputBuffer extends Writer bytesWritten = 0; charsWritten = 0; if (resetWriterStreamFlags) { + if (conv != null) { + conv.recycle(); + encoders.get(conv.getCharset()).push(conv); + } conv = null; enc = null; } Modified: tomcat/trunk/java/org/apache/catalina/connector/Response.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Response.java?rev=1701027&r1=1701026&r2=1701027&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Response.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Response.java Thu Sep 3 14:00:09 2015 @@ -287,17 +287,8 @@ public class Response } - /** - * Clear cached encoders (to save memory for async requests). - */ - public void clearEncoders() { - outputBuffer.clearEncoders(); - } - - // ------------------------------------------------------- Response Methods - /** * Return the number of bytes the application has actually written to the * output stream. This excludes chunking, compression, etc. as well as Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java?rev=1701027&r1=1701026&r2=1701027&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java Thu Sep 3 14:00:09 2015 @@ -124,4 +124,7 @@ public final class C2BConverter { } } + public Charset getCharset() { + return encoder.charset(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org