2012-12-08 10 views
5

Possible Duplicate:
Is it possible to dynamically change maximum java heap size?Gibt es eine Möglichkeit, Java-Heap-Speicher im Code selbst zu erhöhen?

Ich weiß, es ist eine XMX- Option für den Java-Launcher, aber gibt es eine Art Vorverarbeitung Richtlinie, die diese stattdessen tut (so dass alle Computer, die meinen Code ausgeführt wird ihre Haufen erhöht haben).

Wie es jetzt ist, erreicht java.exe ~ 280MB max nur (bevor es abstürzt) - ist das normal?

+0

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

+3

* "Gibt es eine Möglichkeit, Java-Heap zu erhöhen Platz im Code selbst? "* Nein - sobald der Code geladen ist, ist der verfügbare Speicher bereits eingestellt (in Stein). Eine Lösung besteht darin, den Speicher in der aktuellen VM zu überprüfen, und falls nicht genug, 1) starte einen neuen "Prozess" mit mehr Speicher 2) exit. –

+0

@Andrew Thompson: "einen neuen Prozess mit mehr Speicher starten" kann dies im Code getan werden? –

Antwort

1

Ja. Siehe dieses vereinfachte Beispiel.

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

Die Antwort ist "Nein".

Die Speichergröße wird beim Start an die JVM übergeben. Der in der JVM ausgeführte Code kann ihn nicht ändern.

Wenn Sie darüber nachdenken, ist es sinnvoll, weil die JVM ein Programm ist, das nicht in Java geschrieben ist und Java-Bytecode ausführen kann. Es wäre nicht sicher, wenn der Java-Code seinen Container steuern könnte.

+0

Wenn ich die XMX-Route gehen möchte, welche Java-Executable muss diese Starteigenschaft hinzugefügt haben? ... Ich habe nur eine Suche nach java.exe und ich bekomme etwa zwei Dutzend Ergebnisse .. –

+0

oder muss ich dies eingeben in der cmd.exe? –

+0

Es muss eine Befehlszeilenoption sein. Es kann nicht global festgelegt werden. Es ist normalerweise ein vernünftiger Wert, der darauf hinweist, dass es entweder a) Ihre Maschine hat nicht viel Speicher oder wahrscheinlicher b) das Problem ist nicht, was Sie denken, da Sie nicht sehr genau darüber waren, was der "Absturz" ist. IMHO ein Absturz bedeutet, dass Sie ein nicht behandeltes Signal haben und Sie eine Protokolldatei protokolliert haben, nicht einen Fehler oder eine Ausnahme. –

1

Es wäre kein Maximum, wenn Sie es erhöhen könnten.

Der Grund, warum es nicht erhöht werden kann, ist, dass es beim Start zugewiesen wird. Es kann nur eingestellt werden, bevor die JVM startet.

Was Sie tun können, ist die Anwendung mit einem höheren Maximum zu relachen. z.B. Beim Start prüfen Sie das Maximum und wenn es nicht hoch genug ist, führen Sie das gleiche Programm aus, außer mit einem höheren Maximum.

Hinweis: Wenn Sie Off-Heap-Speicher verwenden, kann es GB oder sogar TBs mehr sein, da es nicht Teil des Maximums ist.

Abstürze können fast alles bedeuten und der Grund könnte fast alles sein. Ich schlage vor, Sie genauer untersuchen, warum es nicht funktioniert, und ich vermute, Sie werden feststellen, dass die maximale Speicher nicht das Problem ist. (Es sei denn, Sie haben eine kleine 1-GB-Maschine, in diesem Fall wäre der Standardspeicher maximal 250 MB)

+0

Wo soll ich das XMX-Attribut eingeben? Ich kann die JVM-Befehlszeile nicht finden. Sie haben wahrscheinlich Recht, dass etwas anderes als die maximale Heap-Größe hier die Schuld ist. –

+0

Es kann nur in der Befehlszeile festgelegt werden. Wie läuft das Java-Programm? Wie viel Hauptspeicher hast du? –

+0

16GB, wenn ich es in den cmd eingeben.exe, ich bekomme java wird nicht als interner oder externer Befehl erkannt –