[ umpirsky @ 14.10.2008. 13:10 ] @
Koristim aplet za upload fajlova, kada selektujem malo vise fajlova (npr. 40MB), javlja se problem sa memorijom.

U konzoli dobijam:

Code:

java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
    at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
    ... 4 more
Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.io.ByteArrayOutputStream.write(Unknown Source)
    at sun.net.www.http.PosterOutputStream.write(Unknown Source)
    at umpirsky.ClientHttpRequest.pipe(Unknown Source)
    at umpirsky.ClientHttpRequest.setParameter(Unknown Source)
    at umpirsky.ClientHttpRequest.setParameter(Unknown Source)
    at umpirsky.ClientHttpRequest.setParameter(Unknown Source)
    at umpirsky.ClientHttpRequest.setParameters(Unknown Source)
    at umpirsky.ClientHttpRequest.post(Unknown Source)
    at umpirsky.ClientHttpRequest.post(Unknown Source)
    at umpirsky.UmpirskyUploader.upload(UmpirskyUploader.java:195)
    ... 14 more


Da li je moguće povećati memoriju za aplet, ali ne u podešavanjem JVM na klijentovoj mašini, nego u samom apletu, na primer prilikom komajliranja da se navede mem. ograničenje ili tako nešto?
[ Java Beograd @ 14.10.2008. 14:07 ] @
A šta radiš sa uploadovanim fajlovima ?
[ umpirsky @ 14.10.2008. 14:16 ] @
Stavljam ih u ArrayList<File> koji je privatni atribut mog apleta, onda ih kasnije uploadujem na server kad korisnik inicira akciju...
[ umpirsky @ 14.10.2008. 14:17 ] @
DA, možda je to glupo, bolje da čuvam samo reference na te fajlove i rešen problem, jel da?
[ Java Beograd @ 14.10.2008. 14:37 ] @
Pa naravno. Mislim, držati > 40 MBy fajlova u memoriji je malo degutantno, zar ne ?
[ umpirsky @ 14.10.2008. 14:43 ] @
Pa da...zakodirao sam se :)

Bilo mi zgodno da imam ArrayList<File>, imam sve te lepe podatke, putanju, ime, size...ovako ću morati da napravim neku klasu da držim sve to.
[ gajo2 @ 14.10.2008. 14:45 ] @
ArrayList<File> ne drzi bajtove tih fajlova, nego samo reference, tj. ono sto tebi treba. Mozda je nesto drugo u pitanju?
[ umpirsky @ 14.10.2008. 14:52 ] @
Hehum...a šta onda radi FileDataSource ( http://java.sun.com/javase/6/d...activation/FileDataSource.html )
[ gajo2 @ 14.10.2008. 15:09 ] @
Gde si javax.activation nasao? Jel to uopste deo Jave ili ti trebaju neke posebne biblioteke?
Nesto mislim da ti ucitavas sve fajlove u istom trenutku, i to u trenutku kada kliknes na Upload dugme (tako mi izgleda iz stack tracea). Ono sto bi mogao da uradis je da prolazis kroz svaki fajl i uploadujes kroz stream jedan po jedan. Kad vidis da ti to radi, onda kreni da optimizujes pa probaj odjednom 10 MB i nekako pazi da ne prodjes kroz taj limit (bolje 9,5 MB nego 19). Dakle ako imas 50 MB, onda uploaduj iz (recimo) 5 iteracija.
[ umpirsky @ 14.10.2008. 18:48 ] @
Nije problem u ArrayList<File>, u pravu si ona čuva samo reference. Znam da nije tu problem jer ne puca na browse, nego na upload. Za upload koristim http://www.koders.com/java/fid...5BB56629AD65C1FF272EE51A0.aspx , malo sam je modifikovao tako da ima metod koji prima listu fajlova, ali je engine ostao isti (naravno, dajem joj fajl po fajl). Obrati čežnju na metod :

Code:

 private static void pipe(InputStream in, OutputStream out) throws IOException {
    byte[] buf = new byte[500000];
    int nread;
    int total = 0;

    synchronized (in) {
      while((nread = in.read(buf, 0, buf.length)) >= 0) {
        out.write(buf, 0, nread);
        total += nread;
      }
    }
    out.flush();
    buf = null;
  }