Unerklärlicher OutOfMemoryError



  • Hoi... ich habe folgenden Code, um serialisierte Byte-Arrays zu schicken:

    istream = new FileInputStream(selectedFile);
    
    ostream =
    				new ObjectOutputStream(socket.getOutputStream());
    
    byte[] data;
    			boolean hasNext;
    
    			do
    			{
    				if( istream.available() >= segmentSize )
    				{
    					data = new byte[segmentSize];  // OutOfMemory beim Allokieren des Arrays.
    					hasNext = true;
    				}
    				else
    				{
    					data = new byte[istream.available()];
    					hasNext = false;
    				}
    
    				istream.read(data);
    				ostream.writeObject(data);
    				ostream.writeObject(hasNext);
    				ostream.flush();
    			} while( hasNext );
    

    Ich komme da nicht so ganz mit. Meine Theorie wäre ja erst gewesen, dass der OutputStream irgendwann einfach zu fett wird. Das sollte aber IMHO nicht passieren, wenn ich ihn regelmäßig flushe.
    Am istream liegt's wohl auch nicht, weil dann müsste er ja schon direkt beim Öffnen der 200MB - Datei sterben (was natürlich Unsinn wäre). segmentSize ist übrigens ziemlich klein, ein paar kB nur.
    Ich bekommen nach einiger Laufzeit (ca. 30 MB) einen OutOfMemoryError.


  • Mod

    Schmeiß doch mal den integrierten Heap-Profiler an. Der sollte dir doch die Frage beantworten, was dafür verantwortlich ist. ...oder teste mal den JFluid Profiler unter Netbeans.



  • Gibt es ein eclipse-Plugin was du diesbzgl. empfehlenswert findest? Amsonsten werd ich das jetzt schon mal so versuchen, danke.

    Ich hab jetzt nochmal nachgeschaut, aber außer verbose:gc nichts weiteres entdeckt. verbose:gc kenn ich schon, der bringt mir aber glaub ich nichts.

    [Full GC 64988K->64988K(65088K), 0.0428993 secs]

    Was anderes war auch kaum zu erwarten.




Anmelden zum Antworten