Would someone please sanity check me on this, please?

Here is the output from heap checking after 36 hours:

          percent         live       alloc'ed  stack class
 rank   self  accum    bytes objs   bytes objs trace name
    1  3.76%  3.76%   151312 3153 11322240 235880  7960 java.lang.String

That is the #1 entry by live bytes.  3153 strings totaling ~150K.  Checking
the stack trace, I see:

TRACE 7960:
        java.io.UnixFileSystem.list(UnixFileSystem.java:Native method)
        java.io.File.list(File.java:914)

org.apache.james.nntpserver.repository.NNTPSpooler$SpoolerRunnable.run(NNTPS
pooler.java:207)
        java.lang.Thread.run(Thread.java:536)

This is kind of interesting, since other than leaving it enabled, I'm not
using NNTP.  Checking the code ...

 public void run() {
     getLogger().debug("in spool thread");
     try {
         while ( Thread.currentThread().interrupted() == false ) {
             String[] list = spoolPath.list();
             for ( int i = 0 ; i < list.length ; i++ ) {
                 getLogger().debug("Files to process: "+list.length);
                 if ( lock.lock(list[i]) ) {
                     File f = new File(spoolPath,list[i]).getAbsoluteFile();
                     getLogger().debug("Processing file:
"+f.getAbsolutePath());
                     try {
                         process(f);
                     } catch(Exception ex) {
                         getLogger().debug("Exception occured while
processing file: " +
                                            f.getAbsolutePath(),ex);
                     } finally {
                         lock.unlock(list[i]);
                     }
                 }
             }
             // this is good for other non idle threads
             try {
                 Thread.currentThread().sleep(threadIdleTime);
             } catch(InterruptedException ex) {
                 // Ignore and continue
             }
         }
     } finally {
        Thread.currentThread().interrupted();
     }
 }

Amongst other things, during the entire sleep time, we are keeping a lot of
strings locked in memory.  Seems to me that at the end of the for() loop, we
should add:

 list[i] = null; // release this string entry

and after the for() loop:

 list = null; // release the array.

I have some other questions, but this is the first thing that jumped out.

        --- Noel


--
To unsubscribe, e-mail:   <mailto:james-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:james-dev-help@;jakarta.apache.org>

Reply via email to