James, thank you very much for such a detailed description. I appreciate your effort and I'm sure this experience helped me to learn a lot of new things. Nevertheless, I would like to clarify few things: Here is a definition of memory leak: "If a program holds a reference to a heap chunk that is not used during the rest of its life, it is considered a memory leak because the memory could have been freed and reused. GC won't reclaim it due to the reference being held by the program." I agree, your example proved that WicketApplication instance is used by InheritableThreadLocal (that is exactly what ITL does). Have you managed to find it even after the servlet container was stopped? Isn't it important to prove that the 'WicketApplication' instance outlives the servlet container and holds a reference to a heap chunk? To make it simpler to test, I have changed a little bit your quickstart, making the WicketApplication intance insanely big, by adding a very large object (50MB). My expectation was, in order to prove the memory leak, to see that the physical memory used by the JVM increases by 50MB after each restart, or at least steadily grow. You can check this by monitoring the 'Local' entry and the memory details from the right pane of the VisualVM window. But the actual behavior seems to be different: performing several times the same flow: "start the server->load the home page->stop the server" doesn't increase the heap memory usage. The memory usage comes back to normal after each restart.
I do not want to draw the conclusion, because I could have a wrong understanding of what a 'memory leak' is and how to prove it correctly. That is why, I'm kindly asking you (or anybody else) to interpret my findings. Thank you! Regards, Alex Objelean PS: by the way, I'm using jdk 1.6.0_13-b03 if it does make any difference -- View this message in context: http://apache-wicket.1842946.n4.nabble.com/vote-Revert-WICKET-2846-tp2226987p2230796.html Sent from the Wicket - Dev mailing list archive at Nabble.com.