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

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

Reply via email to