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

Reply via email to