Domanda

Sto cercando di caricare i file di immagine. Quando il caricamento di file di dimensioni di circa 40 a 200KB tutto va bene. Ma quando provo a caricare un file di dimensioni 459KB a volte si ottiene caricato e, talvolta, viene mostrato OutOfMemoryError. Non credo che la dimensione del file è molto grande per questo errore per essere gettato. Sto utilizzando resina. E 'possibile ci sia un ambiente resina che impedisce il caricamento di file di grandi dimensioni? Perché il codice non v'è nulla che sto impostando qualsiasi dimensione massima per il caricamento di file.

Chiunque ha tutte le idee su come evitare questo. Voglio agli utenti di caricare le immagini di qualsiasi dimensione fino a circa 10 MB.

È stato utile?

Soluzione

Se si esegue fuori la memoria, la prima cosa da controllare è la quantità di memoria JVM ha stanziato. Tu non dici come resina è in funzione o che JVM sta usando o il sistema operativo / host, ma in genere una JVM sarà regolato da una dimensione predefinita heap e una dimensione massima di heap. Dalla riga di comando lo standard JVM ha dei parametri -Xms e -Xmx che governano questi valori. Quando la JVM si avvia alloca l'heap di default e permetterà di crescere al massimo. Quando uno stanziamento supera il massimo mucchio potrebbe provare a rilasciare qualsiasi soft / riferimenti deboli e di altre risorse disponibili, forzare un GC, ma se ha ancora sufficiente spazio si getterà un OutOfMemoryException. Quindi cambiando i valori possono influenzare quando questo accade.

La seconda cosa da cercare è come allocare la memoria nel server. Ad esempio, se il server contiene un mucchio di roba in memoria con riferimenti forti si può esaurire la memoria, in tal caso è consigliabile utilizzare un debole riferimenti al posto o qualcosa di simile EHCache per spostare roba su disco. Oppure, se il servlet sono stati assegnando MB invece di KB a causa di un qualche tipo di errore di calcolo. Non si dovrebbe cercare di leggere l'intero di ingresso nella memoria in ogni caso. Supponendo si implementa una servlet, quindi la dotazione ServletRequest / HttpServletRequest permette di accedere al flusso di ingresso del POSTDATA e si può leggere in blocchi (ad esempio 32 KB alla volta) e scrivere ad un buffer di uscita in blocchi. Come regola generale di pollice lettura dati di input in blocchi discreti sarebbero meglio la pratica in ogni caso dal momento che non desidera che i dati non attendibili per essere in grado di rompere il server passando qualche file enorme per voi.

Altri suggerimenti

OutOfMemoryError sono gettati da JVM quando non abbastanza memoria disponibile per una determinata azione (di un'istanza di oggetto, ad esempio)

Per evitare questo tipo di errori è possibile aumentare l'avaible memoria per la JVM in fase di avvio utilizzando una specifica opzione a seconda della JVM (di solito -Xmx512m per 512 Megas)

Nel tuo caso, così piccola di upload non dovrebbe generare alcun OutOfMemoryError e mi consiglia di utilizzare uno strumento come Memory Analyzer di identificare l'origine dell'errore.

Durante il tentativo di avviare l'applicazione impostare le dimensioni max e min per heap e aree riservate

utilizzando Xmx Xms XSS

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top