Re: Memory Management using Tomcat

From: Michael Gentry (mgentr..asslight.net)
Date: Wed Sep 16 2009 - 16:52:52 EDT

  • Next message: Michael Gentry: "Re: Memory Management using Tomcat"

    Joe, keep in mind that a 64-bit Linux doesn't mean you'll be running a
    64-bit JVM.

    Can you add a -Dcom.sun.management.jmxremote to your VM startup
    arguments for Tomcat and then use JConsole to connect to it?

    On Wed, Sep 16, 2009 at 3:15 PM, Joe Baldwin <jfbaldwi..arthlink.net> wrote:
    > Michael,
    >
    > Thanks for responding so fast (I appreciate it).
    >
    > 1. The box is shared but the Tomcat server is dedicated to my project only.
    > 2. The box is 64 bits (Linux 2.6.25-14.fc9.x86_64 (amd64))
    > 3. They have three plans available: 64MB, 128MB, and 256MB
    >
    > Since we only have one - two users right now I selected 64MB until it goes
    > live.  But based on the recommendations today, we are immediately upgrading
    > to 128MB.
    >
    > FYI: I have only about 500 products (and am anticipating 5000 products).  I
    > do not use any BLOB's in the database (we only use file system references to
    > pictures and audio).  So I am very concerned that I missed something
    > fundamental (if you are able to handle 10,000 objects easily).
    >
    > Questions:
    > 1. The WebHost POC asked me to ask you for a recommendation for Xmx.
    > 2. In the event I made a programming error: please let me know how to
    > properly release the memory from a result set (ArrayList) in this scenario.
    >  I am a tad confused with the BaseContext management and could have made a
    > mistake there.
    >
    > Thanks,
    > Joe
    >
    > PS other than this Memory Management issue Cayenne 3M6 has been rock-solid!!
    >
    >
    >
    > On Sep 16, 2009, at 2:57 PM, Michael Gentry wrote:
    >
    >> Is your hosting company giving you a private dedicated box (or VM) or
    >> is your application shared with other applications running in Tomcat?
    >> If the latter, that would skew things, I think.  Also, if you are
    >> running a 64-bit JVM, then it'll use more memory.  It won't be 2x
    >> more, but it'll be more.
    >>
    >> In your Cayenne Model, under the DataDomain, what is the size of your
    >> object cache?
    >>
    >>
    >> On Wed, Sep 16, 2009 at 2:49 PM, Joe Baldwin <jfbaldwi..arthlink.net>
    >> wrote:
    >>>
    >>> Caveat: Apparently I am not as well. :)
    >>>
    >>> 1.) I looked at the 65M issue.  On my development box (OSX) I set it to
    >>> -Xms128m -Xmx128m (basically arbitrary).  So when I went to the remote
    >>> hosting company, I purchase a similar amount.
    >>>       a. However, we are doing *very* little work (lots of product
    >>> fetches
    >>> and only a few product inserts and updates) and it runs out of memory
    >>> *very*
    >>> fast which I *assume* means it is my code, but I don't know.
    >>>       b. I am doing research and here is a "web recommendation" (for all
    >>> that is worth)
    >>>               Whenever possible, Unidata recommends
    >>>       -Xmx1500m for 32-bit systems, and -Xmx2048m --Xmx4096m for 64-bit
    >>> systems.
    >>>       c. Since the host is 64-bit, I am wondering whether my assumptions
    >>> may be off for 64-bit systems.
    >>>
    >>> 2. DataContext: Sorry, but I am getting confused on this one.  I am using
    >>> BaseContext.getThreadObjectContext() based on recommendations (I
    >>> converted
    >>> all the old DataContext refs to BaseContext, but I don't really
    >>> understand
    >>> it from reading the docs) and am *not* releasing it at the end of
    >>> session.
    >>>  Not quite sure of how to do this properly.
    >>>
    >>> 3. Don't know how to set the cache to retain N number of objects. I
    >>> experimented with
    >>>       query.setPageSize(RowsPerPage);
    >>>       query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
    >>>       query.setCacheGroups("product", "ProductList");
    >>>
    >>> This seemed to help quite a bit but I still eventually ran out of memory.
    >>>  I
    >>> recently removed *all* the SHARED_CACHE and it ran out of memory very
    >>> fast.
    >>>
    >>> Thanks for your input
    >>> Joe
    >>>
    >>>
    >>>
    >>> On Sep 16, 2009, at 2:25 PM, Mike Kienenberger wrote:
    >>>
    >>>> Caveat: I'm not really an expert on Cayenne memory management.
    >>>>
    >>>> 1) Are you allocating enough heap memory to the app server to start
    >>>> with?   I don't know what the default is these days, but in the old
    >>>> days, an application by default only gets 64Mb of memory -- that's
    >>>> pretty small.
    >>>>
    >>>> 2) Are you using a new DataContext per request?  Or at least per
    >>>> session?
    >>>>
    >>>> 3) I seem to remember that the cache strategy is configurable.  Have
    >>>> you configured a cache that only retains N number of objects for a
    >>>> suitable value of N?
    >>>>
    >>>> On Wed, Sep 16, 2009 at 2:11 PM, Joe Baldwin <jfbaldwi..arthlink.net>
    >>>> wrote:
    >>>>>
    >>>>> Hi,
    >>>>>
    >>>>> I have asked this question a number of ways but I still have a very
    >>>>> serious
    >>>>> problem with Cayenne-specific memory management configuration
    >>>>> associated
    >>>>> with Tomcat.
    >>>>>
    >>>>> The problem with debugging is that given that I have very little
    >>>>> visibility
    >>>>> into the Cayenne memory management it is extremely difficult to debug
    >>>>> this
    >>>>> using conventional strategies.  Also I am not requesting anything from
    >>>>> the
    >>>>> system that is terribly exceptional so I am attempting to use default
    >>>>> settings as much as possible.
    >>>>>
    >>>>> My strategy is to ask the experts for a Cayenne configuration and
    >>>>> standard
    >>>>> memory management steps I should take to conform to the new Cayenne
    >>>>> memory
    >>>>> management design intentions.
    >>>>>
    >>>>> Problem:
    >>>>> 1. I have essentially a webstore, three tier design with Tomcat,
    >>>>> Cayenne
    >>>>> and
    >>>>> MySQL.
    >>>>> 2. When after only a few queries of products, tomcat freezes up and
    >>>>> reports
    >>>>> out of memory errors.
    >>>>>
    >>>>> I have attempted to configure the caching strategy ask best as I can
    >>>>> understand from the docks but this only gets me a few more hours of
    >>>>> usage
    >>>>> before the out of memory errors.  (I tried the SHARED_CACHE). The
    >>>>> NO_CACHE
    >>>>> strategy is worse.
    >>>>>
    >>>>> I would appreciate a set of steps (aka a primer) that should handle a
    >>>>> website with a lot of fetches of hundreds of data objects (i.e.
    >>>>> products)
    >>>>> and very few updates.
    >>>>>
    >>>>> Note: My gut feeling is that I am not properly managing the data object
    >>>>> array properly and it is leaking memory.
    >>>>>
    >>>>> I would appreciate any input, but I would first like to know what the
    >>>>> minimum require steps are for managing at data object result set
    >>>>> ArrayList
    >>>>> so as to properly cache and then properly free the memory after it is
    >>>>> no
    >>>>> longer needed.
    >>>>>
    >>>>> Context: Tomcat, MySQL, Cayenne 3.0M6
    >>>>>
    >>>>> Thanks,
    >>>>> Joe Baldwin
    >>>>>
    >>>>>
    >>>
    >>>
    >
    >



    This archive was generated by hypermail 2.0.0 : Wed Sep 16 2009 - 16:53:25 EDT