2 Stimmen

Java blockiert Speicher

Ich habe ein Java-Programm, das eine schwache Hashmap zum Zwischenspeichern einiger Dinge verwendet. Wenn Java mehr Speicher benötigt, wird die schwache HashMap geleert. Das funktioniert gut für mich. Jetzt habe ich auch ein C#-Programm auf demselben Computer laufen und folgendes festgestellt.

Wenn das Java-Programm läuft, läuft mein C#-Programm manchmal nicht richtig, wenn der Computer stark beansprucht wird. Andererseits läuft mein C#-Programm auch zu diesen Zeiten problemlos, wenn das Java-Programm nicht läuft.

Könnte es sein, dass mein Java-Programm Speicher blockiert, den mein C#-Programm nutzen könnte? Wie kann ich das herausfinden?

2voto

djna Punkte 53789

Ihr Java-Programm wird seinen Heap auf eine bestimmte Größe erweitern. Die Garbage Collection wird Objekte freigeben und sie in den freien Speicher des Heaps zurückbringen, reduziert jedoch nicht den insgesamt vom Java-Programm verwendeten Speicher.

Verwenden Sie die Fähigkeiten Ihres Betriebssystems, um den Speicherbedarf der C++ und Java-Apps zu untersuchen.

Sie können Befehlszeilenoptionen auf Ihrem JVM verwenden, um die maximale Heap-Größe für Java zu kontrollieren und somit zu begrenzen, wie hungrig es sein wird. Natürlich, wenn Sie einen riesigen Heap benötigen, ist es möglich, dass nicht alles auf einem einzigen Gerät Platz findet.

2voto

serg10 Punkte 30302

Sie können für den .NET CLR-Speicherplatz keine maximale Grenze festlegen, wie Sie es bei Ihrem JVM-Speicherplatz getan haben. Siehe diese Frage für weitere Informationen. Der CLR wird einfach versuchen, seinen Speicherplatz zu erweitern, bis er auf das von Ihrem Betriebssystem auferlegte Prozessspeicherlimit stößt oder der verfügbare Speicherplatz Ihres Computers aufgebraucht ist.

Also ja, wenn Sie die Größe Ihres JVM-Speichers erhöhen, könnten Sie Speicherplatz reservieren, den Ihr CLR sonst verwenden würde. Der JVM wird beim Start mit dem unteren Grenzwert beginnen und bei Bedarf auf den oberen Grenzwert erweitern. Wie oben erwähnt, wird dieser Speicherplatz außerhalb der JVM nicht freigegeben - er steht dem .NET CLR nicht zur Verfügung.

Sie müssen jedoch einige weitere Überwachungen durchführen, um festzustellen, ob Speicherplatz tatsächlich das Problem darstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X