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: [email protected]
For additional commands, e-mail: [email protected]