Author: markt Date: Sun Sep 23 10:36:58 2012 New Revision: 1389005 URL: http://svn.apache.org/viewvc?rev=1389005&view=rev Log: More GC reduction in the AccessLog. Integer.toString(response.getStatus()) was responsible for ~4% of allocated objects under load
Modified: tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java tomcat/trunk/java/org/apache/catalina/valves/Constants.java Modified: tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java?rev=1389005&r1=1389004&r2=1389005&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java Sun Sep 23 10:36:58 2012 @@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentLi import javax.servlet.ServletException; import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.catalina.AccessLog; @@ -1617,7 +1618,134 @@ public class AccessLogValve extends Valv public void addElement(CharBuffer buf, Date date, Request request, Response response, long time) { if (response != null) { - buf.append(Integer.toString(response.getStatus())); + // This approach is used to reduce GC + switch (response.getStatus()) { + case HttpServletResponse.SC_CONTINUE: + buf.put(Constants.SC_CONTINUE_CHAR); + break; + case HttpServletResponse.SC_SWITCHING_PROTOCOLS: + buf.put(Constants.SC_SWITCHING_PROTOCOLS_CHAR); + break; + case HttpServletResponse.SC_OK: + buf.put(Constants.SC_OK_CHAR); + break; + case HttpServletResponse.SC_CREATED: + buf.put(Constants.SC_CREATED_CHAR); + break; + case HttpServletResponse.SC_ACCEPTED: + buf.put(Constants.SC_ACCEPTED_CHAR); + break; + case HttpServletResponse.SC_NON_AUTHORITATIVE_INFORMATION: + buf.put(Constants.SC_NON_AUTHORITATIVE_INFORMATION_CHAR); + break; + case HttpServletResponse.SC_NO_CONTENT: + buf.put(Constants.SC_NO_CONTENT_CHAR); + break; + case HttpServletResponse.SC_RESET_CONTENT: + buf.put(Constants.SC_RESET_CONTENT_CHAR); + break; + case HttpServletResponse.SC_PARTIAL_CONTENT: + buf.put(Constants.SC_PARTIAL_CONTENT_CHAR); + break; + case HttpServletResponse.SC_MULTIPLE_CHOICES: + buf.put(Constants.SC_MULTIPLE_CHOICES_CHAR); + break; + case HttpServletResponse.SC_MOVED_PERMANENTLY: + buf.put(Constants.SC_MOVED_PERMANENTLY_CHAR); + break; + case HttpServletResponse.SC_MOVED_TEMPORARILY: + buf.put(Constants.SC_MOVED_TEMPORARILY_CHAR); + break; + case HttpServletResponse.SC_SEE_OTHER: + buf.put(Constants.SC_SEE_OTHER_CHAR); + break; + case HttpServletResponse.SC_NOT_MODIFIED: + buf.put(Constants.SC_NOT_MODIFIED_CHAR); + break; + case HttpServletResponse.SC_USE_PROXY: + buf.put(Constants.SC_USE_PROXY_CHAR); + break; + case HttpServletResponse.SC_TEMPORARY_REDIRECT: + buf.put(Constants.SC_TEMPORARY_REDIRECT_CHAR); + break; + case HttpServletResponse.SC_BAD_REQUEST: + buf.put(Constants.SC_BAD_REQUEST_CHAR); + break; + case HttpServletResponse.SC_UNAUTHORIZED: + buf.put(Constants.SC_UNAUTHORIZED_CHAR); + break; + case HttpServletResponse.SC_PAYMENT_REQUIRED: + buf.put(Constants.SC_PAYMENT_REQUIRED_CHAR); + break; + case HttpServletResponse.SC_FORBIDDEN: + buf.put(Constants.SC_FORBIDDEN_CHAR); + break; + case HttpServletResponse.SC_NOT_FOUND: + buf.put(Constants.SC_NOT_FOUND_CHAR); + break; + case HttpServletResponse.SC_METHOD_NOT_ALLOWED: + buf.put(Constants.SC_METHOD_NOT_ALLOWED_CHAR); + break; + case HttpServletResponse.SC_NOT_ACCEPTABLE: + buf.put(Constants.SC_NOT_ACCEPTABLE_CHAR); + break; + case HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED: + buf.put(Constants.SC_PROXY_AUTHENTICATION_REQUIRED_CHAR); + break; + case HttpServletResponse.SC_REQUEST_TIMEOUT: + buf.put(Constants.SC_REQUEST_TIMEOUT_CHAR); + break; + case HttpServletResponse.SC_CONFLICT: + buf.put(Constants.SC_CONFLICT_CHAR); + break; + case HttpServletResponse.SC_GONE: + buf.put(Constants.SC_GONE_CHAR); + break; + case HttpServletResponse.SC_LENGTH_REQUIRED: + buf.put(Constants.SC_LENGTH_REQUIRED_CHAR); + break; + case HttpServletResponse.SC_PRECONDITION_FAILED: + buf.put(Constants.SC_PRECONDITION_FAILED_CHAR); + break; + case HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE: + buf.put(Constants.SC_REQUEST_ENTITY_TOO_LARGE_CHAR); + break; + case HttpServletResponse.SC_REQUEST_URI_TOO_LONG: + buf.put(Constants.SC_REQUEST_URI_TOO_LONG_CHAR); + break; + case HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE: + buf.put(Constants.SC_UNSUPPORTED_MEDIA_TYPE_CHAR); + break; + case HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE: + buf.put(Constants.SC_REQUESTED_RANGE_NOT_SATISFIABLE_CHAR); + break; + case HttpServletResponse.SC_EXPECTATION_FAILED: + buf.put(Constants.SC_EXPECTATION_FAILED_CHAR); + break; + case HttpServletResponse.SC_INTERNAL_SERVER_ERROR: + buf.put(Constants.SC_INTERNAL_SERVER_ERROR_CHAR); + break; + case HttpServletResponse.SC_NOT_IMPLEMENTED: + buf.put(Constants.SC_NOT_IMPLEMENTED_CHAR); + break; + case HttpServletResponse.SC_BAD_GATEWAY: + buf.put(Constants.SC_BAD_GATEWAY_CHAR); + break; + case HttpServletResponse.SC_SERVICE_UNAVAILABLE: + buf.put(Constants.SC_SERVICE_UNAVAILABLE_CHAR); + break; + case HttpServletResponse.SC_GATEWAY_TIMEOUT: + buf.put(Constants.SC_GATEWAY_TIMEOUT_CHAR); + break; + case HttpServletResponse.SC_HTTP_VERSION_NOT_SUPPORTED: + buf.put(Constants.SC_HTTP_VERSION_NOT_SUPPORTED_CHAR); + break; + default: + // Don't use this for known codes due to the garbage the + // conversion creates + buf.append(Integer.toString(response.getStatus())); + break; + } } else { buf.append('-'); } Modified: tomcat/trunk/java/org/apache/catalina/valves/Constants.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/Constants.java?rev=1389005&r1=1389004&r2=1389005&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/Constants.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/Constants.java Sun Sep 23 10:36:58 2012 @@ -36,4 +36,44 @@ public final class Constants { public static final String COMBINED_PATTERN = "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\""; } + public static final char[] SC_CONTINUE_CHAR = new char[] {'1', '0', '0'}; + public static final char[] SC_SWITCHING_PROTOCOLS_CHAR = new char[] {'1', '0', '1'}; + public static final char[] SC_OK_CHAR = new char[] {'2', '0', '0'}; + public static final char[] SC_CREATED_CHAR = new char[] {'2', '0', '1'}; + public static final char[] SC_ACCEPTED_CHAR = new char[] {'2', '0', '2'}; + public static final char[] SC_NON_AUTHORITATIVE_INFORMATION_CHAR = new char[] {'2', '0', '3'}; + public static final char[] SC_NO_CONTENT_CHAR = new char[] {'2', '0', '4'}; + public static final char[] SC_RESET_CONTENT_CHAR = new char[] {'2', '0', '5'}; + public static final char[] SC_PARTIAL_CONTENT_CHAR = new char[] {'2', '0', '6'}; + public static final char[] SC_MULTIPLE_CHOICES_CHAR = new char[] {'3', '0', '0'}; + public static final char[] SC_MOVED_PERMANENTLY_CHAR = new char[] {'3', '0', '1'}; + public static final char[] SC_MOVED_TEMPORARILY_CHAR = new char[] {'3', '0', '2'}; + public static final char[] SC_SEE_OTHER_CHAR = new char[] {'3', '0', '3'}; + public static final char[] SC_NOT_MODIFIED_CHAR = new char[] {'3', '0', '4'}; + public static final char[] SC_USE_PROXY_CHAR = new char[] {'3', '0', '5'}; + public static final char[] SC_TEMPORARY_REDIRECT_CHAR = new char[] {'3', '0', '7'}; + public static final char[] SC_BAD_REQUEST_CHAR = new char[] {'4', '0', '0'}; + public static final char[] SC_UNAUTHORIZED_CHAR = new char[] {'4', '0', '1'}; + public static final char[] SC_PAYMENT_REQUIRED_CHAR = new char[] {'4', '0', '2'}; + public static final char[] SC_FORBIDDEN_CHAR = new char[] {'4', '0', '3'}; + public static final char[] SC_NOT_FOUND_CHAR = new char[] {'4', '0', '4'}; + public static final char[] SC_METHOD_NOT_ALLOWED_CHAR = new char[] {'4', '0', '5'}; + public static final char[] SC_NOT_ACCEPTABLE_CHAR = new char[] {'4', '0', '6'}; + public static final char[] SC_PROXY_AUTHENTICATION_REQUIRED_CHAR = new char[] {'4', '0', '7'}; + public static final char[] SC_REQUEST_TIMEOUT_CHAR = new char[] {'4', '0', '8'}; + public static final char[] SC_CONFLICT_CHAR = new char[] {'4', '0', '9'}; + public static final char[] SC_GONE_CHAR = new char[] {'4', '1', '0'}; + public static final char[] SC_LENGTH_REQUIRED_CHAR = new char[] {'4', '1', '1'}; + public static final char[] SC_PRECONDITION_FAILED_CHAR = new char[] {'4', '1', '2'}; + public static final char[] SC_REQUEST_ENTITY_TOO_LARGE_CHAR = new char[] {'4', '1', '3'}; + public static final char[] SC_REQUEST_URI_TOO_LONG_CHAR = new char[] {'4', '1', '4'}; + public static final char[] SC_UNSUPPORTED_MEDIA_TYPE_CHAR = new char[] {'4', '1', '5'}; + public static final char[] SC_REQUESTED_RANGE_NOT_SATISFIABLE_CHAR = new char[] {'4', '1', '6'}; + public static final char[] SC_EXPECTATION_FAILED_CHAR = new char[] {'4', '1', '7'}; + public static final char[] SC_INTERNAL_SERVER_ERROR_CHAR = new char[] {'5', '0', '0'}; + public static final char[] SC_NOT_IMPLEMENTED_CHAR = new char[] {'5', '0', '1'}; + public static final char[] SC_BAD_GATEWAY_CHAR = new char[] {'5', '0', '2'}; + public static final char[] SC_SERVICE_UNAVAILABLE_CHAR = new char[] {'5', '0', '3'}; + public static final char[] SC_GATEWAY_TIMEOUT_CHAR = new char[] {'5', '0', '4'}; + public static final char[] SC_HTTP_VERSION_NOT_SUPPORTED_CHAR = new char[] {'5', '0', '5'}; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org