[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xmlrpc-dev
Subject:    [jira] [Created] (AXIOM-390) Memory leak in UIDGenerator
From:       Detlef_Günther_(JIRA) <jira () apache ! org>
Date:       2011-09-16 6:49:08
Message-ID: 874086253.33844.1316155748873.JavaMail.tomcat () hel ! zones ! apache ! org
[Download RAW message or body]

Memory leak in UIDGenerator
---------------------------

                 Key: AXIOM-390
                 URL: https://issues.apache.org/jira/browse/AXIOM-390
             Project: Axiom
          Issue Type: Bug
          Components: API
    Affects Versions: 1.2.12
         Environment: Tomcat 7.0.21, Axis2 1.6.1 with Axiom 1.2.12
            Reporter: Detlef Günther


Shutting down tomcat produces a list of error messages for each request of a web \
service:

16.09.2011 08:36:16 org.apache.catalina.loader.WebappClassLoader \
                checkThreadLocalMapForLeaks
SCHWERWIEGEND: The web application [/datatransfer] created a ThreadLocal with key of \
type [org.apache.axiom.util.UIDGenerator$1] (value \
[org.apache.axiom.util.UIDGenerator$1@252a78ee]) and a value of type [long[]] (value \
[[J@7696452]) but failed to remove it when the web application was stopped. Threads \
are going to be renewed over time to try and avoid a probable memory leak. 

Problem seems to be ThreadLocal, which cannot bee cleaned up after processing the \
request. Eliminating ThreadLocal solves the problem:

public final class UIDGenerator {
	//	private static final long				startTimeXorOperand;
	private static final long				threadIdXorOperand;
	private static final long				seqXorOperand;

	static {
		Random rand = new Random();
		threadIdXorOperand = rand.nextLong();
		//		startTimeXorOperand = rand.nextLong();
		seqXorOperand = rand.nextLong();
	}

	private final static AtomicLong	seqValue	= new AtomicLong(0);

	private UIDGenerator() {
	}

	private static void writeReverseLongHex(long value, StringBuilder buffer) {
		for (int i = 0; i < 64; i += 4) {
			int n = (int) (value >> i) & 0xF;
			buffer.append((char) (n < 10 ? '0' + n : 'a' + n - 10));
		}
	}

	/**
	 * Generate a unique ID as hex value and add it to the given buffer. Note that
	 * with respect to the triplet, the order of nibbles is reversed, i.e. the
	 * least significant nibble of the sequence is written first. This makes
	 * comparing two IDs for equality more efficient.
	 * 
	 * @param buffer
	 */
	private static void generateHex(StringBuilder buffer) {
		writeReverseLongHex(seqValue.incrementAndGet() ^ seqXorOperand, buffer);
		writeReverseLongHex(Thread.currentThread().getId() ^ threadIdXorOperand,
				buffer);
	}

...
 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ws.apache.org
For additional commands, e-mail: dev-help@ws.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic