On 17/10/2012 13:57, Konstantin Kolinko wrote:
> 2012/9/23  <ma...@apache.org>:
>> 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:

Go for it.

Mark


> 
> 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: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to