2012/9/23 <[email protected]>:
> 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;
>(...)
> + }
> } 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'};
>(...)
> }
>
It is ugly and unmanageable.
BTW, if someone changes the content of those char arrays, the access
log may become a mess.
I propose to just write the digits. I think the following will work,
appending a digit value to the code of '0' character:
int status = response.getStatus();
if (100 <= status && status < 1000) {
buf.write((char) ('0' + (status/100)));
buf.write((char) ('0' + ((status / 10) % 10)));
buf.write((char) ('0' + (status % 10)));
} else {
buf.write(Integer.toString(status));
}
Best regards,
Konstantin Kolinko
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]