Hi Pid, et al:
Things are curiouser and curiouser. I decided to deploy the struts blank app
after starting tomcat with startup.sh.
Well there is no memory leak after undeploy and redeploy. If I start tomcat
with jsvc, I get a memory leak.
This is the minimal init script I used to start the tomcat daemon.
snip..
# Source function library.
. /etc/init.d/functions
# Adapt the following lines to your configuration
JAVA_HOME=/usr/java/jdk1.6.0_18
CATALINA_HOME=/home/vir6.0.26/apache-tomcat-6.0.26
DAEMON_HOME=$CATALINA_HOME/bin
TOMCAT_USER=mas
#CATALINA_OPTS="-Djava.awt.headless=true "
#LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_HOME/conf/logging.properties"
#JAVA_OPTS="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
start(){
$DAEMON_HOME/jsvc \
-jvm server \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.base=$CATALINA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$CATALINA_HOME/temp \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
echo "starting: " $CATALINA_HOME
echo "tomcat user: " $TOMCAT_USER
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
}
stop(){
# killproc jsvc
# PID=`cat /var/run/jsvc.pid`
# kill $PID
$DAEMON_HOME/jsvc \
-stop \
-pidfile /var/run/jsvc.pid \
org.apache.catalina.startup.Bootstrap
echo "stopping tomcat: " $CATALINA_HOME
echo "tomcat user: " $TOMCAT_USER
}
case "$1" in
start)
#
# Start Tomcat
#
start
;;
status)
status jsvc
;;
stop)
#
# Stop Tomcat
#
stop
;;
restart)
stop
start
;;
*)
echo "Usage tomcat6.0.26 start/stop/restart/status"
exit 1;;
esac
When I load the heap dump and do a classloaderexplorerquery using MAT I get
this:
Class Name | Defined
Classes | No. of Instances
----------------------------------------------------------------------------------------------------------
org.apache.catalina.loader.WebappClassLoader @ 0x94977290 |
260 | 186
|- parent org.apache.catalina.loader.StandardClassLoader @ 0x94861d10|
935 | 3,750
|- org.apache.commons.beanutils.converters.ConverterFacade |
| 54
|- org.apache.commons.logging.impl.Jdk14Logger |
| 38
|- org.apache.commons.beanutils.converters.ArrayConverter |
| 27
|- org.apache.commons.beanutils.WeakFastHashMap |
| 4
|- org.apache.commons.beanutils.converters.BooleanConverter |
| 4
|- org.apache.commons.beanutils.converters.ByteConverter |
| 4
|- org.apache.commons.beanutils.converters.CharacterConverter |
| 4
|- org.apache.commons.beanutils.converters.DoubleConverter |
| 4
|- org.apache.commons.beanutils.converters.FloatConverter |
| 4
|- org.apache.commons.beanutils.converters.IntegerConverter |
| 4
|- org.apache.commons.beanutils.converters.LongConverter |
| 4
|- org.apache.commons.beanutils.converters.ShortConverter |
| 4
|- org.apache.commons.beanutils.converters.DateConverter |
| 3
|- org.apache.commons.beanutils.converters.BigDecimalConverter |
| 2
|- org.apache.commons.beanutils.converters.BigIntegerConverter |
| 2
|- org.apache.commons.beanutils.converters.ClassConverter |
| 2
|- org.apache.commons.beanutils.converters.FileConverter |
| 2
|- org.apache.commons.beanutils.converters.SqlDateConverter |
| 2
|- org.apache.commons.beanutils.converters.SqlTimeConverter |
| 2
|- org.apache.commons.beanutils.converters.SqlTimestampConverter |
| 2
|- org.apache.commons.beanutils.converters.StringConverter |
| 2
|- org.apache.commons.beanutils.converters.URLConverter |
| 2
|- org.apache.commons.beanutils.BeanUtilsBean |
| 1
|- org.apache.commons.beanutils.BeanUtilsBean$1 |
| 1
----------------------------------------------------------------------------------------------------------
If in undeploy and redeploy the struts blank app and do a duplicate classes
query I get this:
Class Name | Count | Defined
Classes | No. of Instances
--------------------------------------------------------------------------------------------------------
org.apache.catalina.loader.JdbcLeakPrevention | 2 |
|
|- org.apache.catalina.loader.WebappClassLoader @ 0x948b5c38| |
260 | 186
|- org.apache.catalina.loader.WebappClassLoader @ 0x94958320| |
260 | 186
'- Total: 2 entries | |
|
org.apache.commons.beanutils.BeanAccessLanguageException | 2 |
|
org.apache.commons.beanutils.BeanUtils | 2 |
|
org.apache.commons.beanutils.BeanUtilsBean | 2 |
|
org.apache.commons.beanutils.BeanUtilsBean$1 | 2 |
|
org.apache.commons.beanutils.ContextClassLoaderLocal | 2 |
|
org.apache.commons.beanutils.ConversionException | 2 |
|
org.apache.commons.beanutils.ConvertUtils | 2 |
|
org.apache.commons.beanutils.ConvertUtilsBean | 2 |
|
org.apache.commons.beanutils.Converter | 2 |
|
org.apache.commons.beanutils.DynaBean | 2 |
|
org.apache.commons.beanutils.DynaClass | 2 |
|
org.apache.commons.beanutils.DynaProperty | 2 |
|
org.apache.commons.beanutils.MappedPropertyDescriptor | 2 |
|
Total: 14 of 260 entries | 520 |
|
--------------------------------------------------------------------------------------------------------
The struts 1.3.10 blank webapp is found here
http://www.alliedquotes.com/mirrors/apache/struts/examples/struts-1.3.10-apps.zip
It is just a shell without much of anything except a welcome page.
I am now worried that I have done something wrong with jsvc (which is why I
included my startup script). I added
-Djava.util.logging.config.file=$CATALINA_HOME/conf/logging.properties and
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager to the script
after snooping in catalina.sh.
This made juli logging work but didn't get rid of the leak.
Any ideas would be appreciated.
mas
On 05/15/2010 04:58 AM, Pid wrote:
> On 14/05/2010 19:21, Mark Shifman wrote:
>> After playing around I don't think the leak is from JAXBContext. My web app
>> is running under struts 1.3.10. I tested
>> the blank web apps that comes with struts 1.3.10 and it showed a memory leak
>> on undeploying and redeploying. (so did the
>> blank web app for the current struts 2). Using Eclipse MAT the retained
>> WebappClassLoader showed a bunch of commons.beanutils
>> classes but I am not sure how to follow it any farther.
>>
>> So either there is something funky with commons.beanutils 1.8.0 (also tried
>> the newer version)(ie something tricky with reflection or commons-logging)
>> or I have some how done something really stupid with my tomcat/jvm
>> configuration that goofs up garbage collection.
>
> Interesting. I had more of a nose around in JAXBContext and the
> peripheral objects and found some things I'm slightly curious about but
> nothing that looks leaky. I'm using JAXB myself and haven't seen much
> of a side-effect.
>
> I'd be happy to have a look at Struts if you'd like to detail some of
> what you've found. Maybe we'll find something that can be contributed
> to the Tomcat JreMemoryLeakPrevention.
>
>
> p
>
>
>> mas
>>
>> On 05/03/2010 12:15 PM, Mark Shifman wrote:
>>> I have a web app running under tomcat-6.0.26 with
>>> JreMemoryLeakPreventionListener, java jdk1.6.0_18.
>>>
>>> Using jmap -histo pid, I can watch
>>> com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl, etc increase in number
>>> after running my unmarshal action, followed by undeploy and redeploy. Find
>>> Leaks in the manager also finds leaks.
>>>
>>> The JAXBContext instance is created with a singleton that is an enum (using
>>> Josh Block's pattern):
>>>
>>> public enum JAXBContextMascot {
>>> INSTANCE("com.matrixscience.xmlns.schema.mascot_search_results_2" );
>>> private JAXBContext ctx;
>>> JAXBContextMascot(String contextPath) {
>>> try {
>>> ctx =JAXBContext.newInstance(clazz);
>>> } catch (JAXBException e) {
>>> throw new RuntimeException(e);
>>> }
>>> }
>>> public Unmarshaller createUnmarshaller(){
>>> try {
>>> return ctx.createUnmarshaller();
>>> } catch (JAXBException e) {
>>> throw new RuntimeException(e);
>>> }
>>> }
>>> }
>>>
>>> Am I doing something wrong which is causing the memory leak?
>>> JAXBContext.newInstance() can take a ClassLoader argument. Is there some
>>> ClassLoader I should be using that will get around this?
>>>
>>> Any help would be appreciated.
>>> mas
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
>
mas
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]