Frage

Ich habe eine Schleife, die eine Menge von Threads laicht. Diese Fäden enthalten unter anderem 2 (massiven) String Objekten. Diese Fäden dann laufen und machen ihr Ding.

Allerdings habe ich festgestellt, dass nach einer gewissen Menge von Fäden, bekomme ich seltsame Abstürze. Ich weiß das, weil dieser String ist, weil, wenn ich ihre Anfangskapazität zu reduzieren, kann ich viel mehr Threads beginnen. Jetzt für diese Stringbuilders, sie sind wie folgt erstellen im Konstruktor des Thread-Objekt:

String a = new Stringbuilder (30000);
String b = new Stringbuilder (30000);

Der Punkt, wo es in der Regel stürzt ab rund 550 Fäden, die mehr als 62MB in einem wenig zur Folge hat. In Verbindung mit dem Rest des Programms im Gebrauch der Speicher ist höchstwahrscheinlich 64MB, die ich irgendwo online gelesen hatte, war die defaulf Größe des Speicherzuteilungs JVM. Ich weiß nicht, ob das wahr ist oder nicht.

Jetzt gibt es etwas, was ich falsch mache, dass irgendwie wegen des Designs, ich bin Speicher Zuweisung des falschen Weges? Oder ist dies der einzige Weg, und soll ich die JVM sagt seinen Speicherpool zu erhöhen? Oder etwas ganz anderes?

Auch bitte sagen Sie mir nicht eine geringere Kapazität zu setzen, ich weiß, dass diese automatisch ihre Stringbuilders Kapazität erhöhen, wenn nötig, aber ich mag eine Lösung für dieses Problem haben.

War es hilfreich?

Andere Tipps

Wenn Sie eine Vielzahl von Informationen in einem String speichern, werden Sie irgendwann es verweisen zurück? Wenn nicht, dann schreiben Sie es einfach auf ein anderes Medium (DB, Datei usw.). Das Programm hat eine endliche Menge an Ressourcen, kann sie nicht alle auf einmal der Zustand eines gesamten Systems halten. -Xmx gibt Ihnen mehr Platz für die Speicherung im Speicher, aber es wird nicht Ihre Speicherfähigkeit unendlich machen.

Betrachten wir ein ThreadPoolExecutor verwenden und auf die Anzahl der CPUs auf Ihrem Rechner die Poolgröße. mehr Threads als CPUs anlegen ist nur Overhead hinzugefügt wird.

ExecutorService service = Executors.newFixedThreadPool(cpuCount))

Sie können aber auch die Speichernutzung reduzieren, indem Sie die Saiten, um Dateien zu schreiben, anstatt sie zu halten in-Speicher mit StringBuilders.

Angenommen, 1 MB pro Faden. Das ist die RAM Kosten jeden zu schaffen, die über dem Speicher durch seinen Prozess zugeordnet werden.

Wie Gregory sagte, geben die Jvm, einige Optionen wie -Xmx.

Sehen Sie sich auch eine Thread oder Executor, um sicherzustellen, dass mit nur eine bestimmte Menge von Threads gleichzeitig ausgeführt werden. Auf diese Weise der Größe des Speichers ohne Verlangsamung begrenzt gehalten werden kann (wie Ihr Prozessor nicht in der Lage zu laufen 550 Threads gleichzeitig ist sowieso).

Und wenn Sie eine Executor verwenden schaffen nicht die Stringbuilders im Konstruktor, aber in der run-Methode.

Sie können eine Filewriter zur Ausgabe von Text in eine Datei, es dann mit einem Filereader zurückziehen. Auf diese Weise müssen Sie nur den Dateinamen im Speicher zu speichern, anstatt den gesamten Inhalt des Strings.

Zur Senkung der Threads Sie ExecutorService verwenden können, oder einfach ein paar Threads verwenden, die aus einer Warteschlange zu lesen.

Meine Vermutung ist, dass mit ein wenig Bastelei Sie wahrscheinlich Ihr Programm nach unten nicht benötigen viel Speicher überhaupt bekommen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top