2012-12-08 10 views
5

Possible Duplicate:
Is it possible to dynamically change maximum java heap size?C'è un modo per aumentare lo spazio heap Java nel codice stesso?

So che c'è un'opzione XMX per il lanciatore Java, ma c'è una sorta di direttiva al preprocessore che fa questo, invece (in modo che tutti i computer che eseguono il mio codice avranno il loro mucchio aumentato).

Come è adesso, java.exe raggiunge solo ~ 280 MB max (prima che si blocchi) - è normale?

+0

correlati: http://stackoverflow.com/questions/193483/how-to-specify-jvm-argument-for-maven-built-executable-jar –

+3

* "C'è un modo per aumentare heap Java spazio nel codice stesso? "* No - una volta caricato il codice, la memoria disponibile è già stata impostata (in pietra). Una soluzione è controllare la memoria nella VM corrente e, se non è sufficiente 1) avviare una nuova uscita 'Process' con più memoria 2). –

+0

@Andrew Thompson: "avviare un nuovo processo con più memoria" può essere fatto nel codice? –

risposta

1

"launch a new Process with more memory" can this be done in the code?

Sì. Vedi questo esempio semplicistico.

import java.awt.EventQueue; 
import javax.swing.JOptionPane; 
import java.io.File; 

class BigMemory { 

    public static void main(String[] args) throws Exception { 
     if (args.length==0) { 
      ProcessBuilder pb = new ProcessBuilder(
       "java", 
       "-Xmx1024m", 
       "BigMemory", 
       "anArgument" 
       ); 
      pb.directory(new File(".")); 
      Process process = pb.start(); 
      process.waitFor(); 
      System.out.println("Exit value: " + process.exitValue()); 
     } else { 
      Runnable r = new Runnable() { 
       public void run() { 
        JOptionPane.showMessageDialog(
         null, 
         "Max Memory: " + 
         Runtime.getRuntime().maxMemory() + 
         " bytes."); 
       } 
      }; 
      EventQueue.invokeLater(r); 
     } 
    } 
} 
3

la risposta è "no".

La dimensione della memoria viene passata alla JVM all'avvio. Il codice in esecuzione all'interno della JVM non può cambiarlo.

Se ci pensi, ha senso, perché la JVM è un programma non scritto in java che può eseguire codice java byte. IT non sarebbe sicuro consentire al codice java di controllare il suo contenitore.

+0

Se voglio andare via XMX, che Java eseguibile ha bisogno di avere questa proprietà di avvio aggiunto? ... ho appena fatto una ricerca per java.exe e ottengo circa due dozzine di risultati .. –

+0

o devo entrare in questo nel cmd.exe? –

+0

Deve essere un'opzione della riga di comando. Non è qualcosa che puoi impostare a livello globale. Di solito è un valore ragionevole che suggerisce sia a) che la tua macchina non ha molta memoria o più probabilità b) il problema non è quello che pensi in quanto non sei stato molto specifico su cosa sia il "crash". IMHO un crash significa che hai un segnale non gestito e avrai un file dump registrato, non un errore o un'eccezione. –

1

non sarebbe un massimo se si potesse aumentare.

Il motivo per cui non può essere aumentato è che è stato assegnato all'avvio. Può essere impostato solo prima dell'avvio della JVM.

Che cosa si può fare è rilanciare la l'applicazione con un massimo più alto. per esempio. All'inizio si controlla il massimo e se non è abbastanza alto si esegue lo stesso programma tranne con un massimo più alto.

Nota: se si utilizza la memoria heap, può essere GB o anche TB in più poiché non fa parte del massimo.

As it is right now, java.exe reaches ~280MB max only (before it crashes) - is this normal?

Gli arresti possono significare qualsiasi cosa e la ragione potrebbe essere qualsiasi cosa. Ti suggerisco di indagare più in dettaglio esattamente perché non funziona e ho il sospetto che troverai che la memoria massima non è il problema. (A meno che non si dispone di una piccola macchina da 1 GB, nel qual caso la memoria massima predefinita sarebbe di circa 250 MB)

+0

Dove devo inserire l'attributo XMX? Non riesco a trovare la riga di comando JVM. Probabilmente hai ragione che qui c'è qualcosa di diverso dalla dimensione massima dell'heap. –

+0

Può essere impostato solo sulla riga di comando. Come stai eseguendo il programma Java? Quanta memoria principale hai? –

+0

16 GB, quando lo inserisco nel cmd.exe, ottengo java non è riconosciuto come comando interno o esterno –

Problemi correlati