Hallo
Also ich habe ein Programm, welches über binare Dateien läuft und bestimmte Datensätze heraus nimmt, welche auf mein Suchkriterium passen. Diese Datensätze werden jetzt in eine Liste gespeichert. Das Problem ist jetzt, wenn meine Suche zu groß wird bekomme ich eine OutOfMemoryError, da JVM mir nur ein bestimmt Platz im Memory frei hält. Ich könnte jetzt natürlich den Zugewiesenen Speicher von JVM vergrößern (z.b. -Xmx200m) aber das ist nicht der Sinn. Ich möchte gerne diese Exception abfangen und dem Nutzer sagen, er solle seine Suche einschränken.
Meine Idee ist es bei dem befüllen der Liste zu prüfen ob der TotalMemory den MaxMemory überschritten hat.
Also:
So, das Funktioniert beim ersten Such lauf gut, aber wenn ich dann noch mal Such, und zwar eine Suche wo ich weiß das sie den Memory nicht überfühlt wird, stoppt er trotz dem das befühlen der Liste, weil nämlich JVM den Total Speicher nicht mehr hergibt und nur intern weiter nutzt (im TaskMan immer 60m), so ist der totalMemory immer gleich wie der MaxMemory.
Wie kann ich das umgehen oder gibt es eine Andere Lösung auf den totalMemory intern zuzugreifen. Oder gibt es eine Möglichkeit den UsageMemory herauszubekommen. Ich habe auch den Garbage Collector vor dem überprüfen des Speichers aufgerufen, klapp auch nicht.
Danke schon mal
Also ich habe ein Programm, welches über binare Dateien läuft und bestimmte Datensätze heraus nimmt, welche auf mein Suchkriterium passen. Diese Datensätze werden jetzt in eine Liste gespeichert. Das Problem ist jetzt, wenn meine Suche zu groß wird bekomme ich eine OutOfMemoryError, da JVM mir nur ein bestimmt Platz im Memory frei hält. Ich könnte jetzt natürlich den Zugewiesenen Speicher von JVM vergrößern (z.b. -Xmx200m) aber das ist nicht der Sinn. Ich möchte gerne diese Exception abfangen und dem Nutzer sagen, er solle seine Suche einschränken.
Meine Idee ist es bei dem befüllen der Liste zu prüfen ob der TotalMemory den MaxMemory überschritten hat.
Also:
Code:
double totalMemory = Runtime.getRuntime().totalMemory();
//die mal 0.90 wegen den 10% abzug
double maxMemory = Runtime.getRuntime().maxMemory()*0.90;
if( totalMemory >= maxMemory){
//her das befühlen der Liste stoppen
}
So, das Funktioniert beim ersten Such lauf gut, aber wenn ich dann noch mal Such, und zwar eine Suche wo ich weiß das sie den Memory nicht überfühlt wird, stoppt er trotz dem das befühlen der Liste, weil nämlich JVM den Total Speicher nicht mehr hergibt und nur intern weiter nutzt (im TaskMan immer 60m), so ist der totalMemory immer gleich wie der MaxMemory.
Wie kann ich das umgehen oder gibt es eine Andere Lösung auf den totalMemory intern zuzugreifen. Oder gibt es eine Möglichkeit den UsageMemory herauszubekommen. Ich habe auch den Garbage Collector vor dem überprüfen des Speichers aufgerufen, klapp auch nicht.
Danke schon mal