[ http://issues.apache.org/jira/browse/JAMES-512?page=comments#action_12413723 ]
Quande Ren commented on JAMES-512: ---------------------------------- Hi, Stefano, Here is the changed version of File_Persistent_Object_Repository.java according to your suggestion No. 1. I tested the basic functions according to my knowledge and it is working. There's no memory leak anymore. Let me know your comments. Quande /*********************************************************************** * Copyright (c) 2000-2004 The Apache Software Foundation. * * All rights reserved. * * ------------------------------------------------------------------- * * Licensed under the Apache License, Version 2.0 (the "License"); you * * may not use this file except in compliance with the License. You * * may obtain a copy of the License at: * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * * implied. See the License for the specific language governing * * permissions and limitations under the License. * ***********************************************************************/ package org.apache.james.mailrepository.filepair; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import org.apache.avalon.cornerstone.services.store.StreamRepository; import org.apache.avalon.excalibur.io.IOUtil; /** * Implementation of a StreamRepository to a File. * TODO: -retieve(String key) should return a FilterInputStream to allow * mark and reset methods. (working not like BufferedInputStream!!!) * */ public class File_Persistent_Stream_Repository extends AbstractFileRepository implements StreamRepository { //protected final HashMap m_inputs = new HashMap(); //protected final HashMap m_outputs = new HashMap(); protected String getExtensionDecorator() { return ".FileStreamStore"; } /** * Get the object associated to the given unique key. */ public synchronized InputStream get( final String key ) { try { final ResettableFileInputStream stream = new ResettableFileInputStream( getFile( key ) ); /* final Object o = m_inputs.get( key ); if( null == o ) { m_inputs.put( key, stream ); } else if( o instanceof ArrayList ) { ( (ArrayList)o ).add( stream ); } else { final ArrayList list = new ArrayList(); list.add( o ); list.add( stream ); m_inputs.put( key, list ); } */ return stream; } catch( final IOException ioe ) { final String message = "Exception caught while retrieving a stream "; getLogger().warn( message, ioe ); throw new RuntimeException( message + ": " + ioe ); } } /** * Store the given object and associates it to the given key */ public synchronized OutputStream put( final String key ) { try { final OutputStream outputStream = getOutputStream( key ); final BufferedOutputStream stream = new BufferedOutputStream( outputStream ); /* final Object o = m_outputs.get( key ); if( null == o ) { m_outputs.put( key, stream ); } else if( o instanceof ArrayList ) { ( (ArrayList)o ).add( stream ); } else { final ArrayList list = new ArrayList(); list.add( o ); list.add( stream ); m_outputs.put( key, list ); } */ return stream; } catch( final IOException ioe ) { final String message = "Exception caught while storing a stream "; getLogger().warn( message, ioe ); throw new RuntimeException( message + ": " + ioe ); } } public synchronized void remove( final String key ) { /* Object o = m_inputs.remove( key ); if( null != o ) { if( o instanceof InputStream ) { IOUtil.shutdownStream( (InputStream)o ); } else { final ArrayList list = (ArrayList)o; final int size = list.size(); for( int i = 0; i < size; i++ ) { IOUtil.shutdownStream( (InputStream)list.get( i ) ); } } } o = m_outputs.remove( key ); if( null != o ) { if( o instanceof OutputStream ) { IOUtil.shutdownStream( (OutputStream)o ); } else { final ArrayList list = (ArrayList)o; final int size = list.size(); for( int i = 0; i < size; i++ ) { IOUtil.shutdownStream( (OutputStream)list.get( 0 ) ); } } } */ super.remove( key ); } public long getSize(final String key) { try { return getFile(key).length(); } catch(IOException e) { return 0; } } } > OutOfMemoryError -- object not released. > ---------------------------------------- > > Key: JAMES-512 > URL: http://issues.apache.org/jira/browse/JAMES-512 > Project: James > Type: Bug > Components: MailStore & MailRepository > Versions: 2.2.0 > Environment: windows XP, > Java 1.5.0_06 > Reporter: Quande Ren > Assignee: Stefano Bagnara > Priority: Critical > Fix For: 2.3.0a4 > Attachments: picture.GIF > > I use the file system to store the emails. > When I run the James for a long time, the james server used more and more > heap memory, eventually it runs out of memory and refuse to receive email. > only restart the james will work. > I used JProfile Memory Debugger(you can get the trial version from > www.quest.com) and found a clue. the object allocated from following code at > line 92 does not always get released, cause the memory been used up > eventually. I will attach a picture file showing the call stack. > 91, final OutputStream outputStream = getOutputStream( key ); > 92, final BufferedOutputStream stream = new BufferedOutputStream( > outputStream ); > 93 > 94, final Object o = m_outputs.get( key ); > 95, if( null == o ) > 96, { > 97, m_outputs.put( key; stream ); > 98, } > 99, else if( o instanceof ArrayList ) > 100, { > 101, ( (ArrayList)o ).add( stream ); > 102, } > 103, else > 104, { > 105, final ArrayList list = new ArrayList(); > 106, list.add( o ); > 107, list.add( stream ); > 108, m_outputs.put( key; list ); > 109, } > 110 > 111, return stream; -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]