-Xmx wird nicht beachtet?

Status
Nicht offen für weitere Antworten.

boesi

Aktives Mitglied
moin


Kurz vorweg: im folgenden bezieh ich mich beim Speicherverbrauch auf die Angabe "Private Bytes" im Process Explorer.

Ich hab eine Anwendung, die rund 190MB Speicher benötigt. Also verwend ich beim Starten der VM den Parameter -Xmx256m. Hat soweit auch immer super funktioniert.

Jetzt hab ich durch ein Speicherleck aber festgestellt, dass die Grenze von 256MB schlicht nicht beachtet wird. Stattdessen kommt die OutOfMemory Exception erst bei über 300MB. Das Leck hab ich inzwischen gefunden.

Hab nun mit verschiedenen Grenzen experimentiert und festgestellt, dass es wurscht ist, was ich verwende - es gibt keine OufOfMemoryException mehr. Also wie bekomm ich meine Exception wieder?


Vielen Danke für Eure Hilfe
Mfg boesi


PS: ach ja getestet hab ich das mit 1.6.0_u10 unter Vista; 1.6.0_10 unter Windows Server 2003 in einer VM und 1.6.0_07 unter XP. Irgendwann in der Vergangenheit hat das aber mal funktioniert.
 
S

SlaterB

Gast
ich weiß nicht woran das liegt, was immer du da hast,
nur falls du folgende Befehle noch nicht kennst:

Code:
public class Test {

	public static void main(String[] args) throws Exception {
		Runtime r = Runtime.getRuntime();
		System.out.println(r.freeMemory());
		System.out.println(r.totalMemory());
		System.out.println(r.maxMemory());

	}
}
siehe auch API
 

boesi

Aktives Mitglied
SlaterB hat gesagt.:
ich weiß nicht woran das liegt, was immer du da hast,
nur falls du folgende Befehle noch nicht kennst:
gekannt hatte ich die Befehle schon, aber mich nie bewußt damit beschäftigt. Hab ich aber jetzt - rausgekommen ist die Klasse unten. Im Process Explorer (im Taskmanager bestimmt auch) kann man nun schön verfolgen, wie der GC den Speicher freiräumt - und sieht auch, dass neben dem "memory allocation pool" noch weiterer Speicher von der VM belegt wird. Interessant ist auch, das der GC mehrere (manuelle) Durchläufe braucht um den Speicher freizugeben.
Code:
package test;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 * @author boesi
 * @date 29.11.2008
 *
 */
public class MemoryTester extends JFrame {

	JButton btnStart = new JButton("Start");
	JButton btnClear = new JButton("Leeren");
	JButton btnGC = new JButton("Garbage Collector");
	JButton btnRefresh = new JButton("Aktualisiern");
	Runtime rt = Runtime.getRuntime();

	Background bg = null;

	ArrayList<Integer> array = new ArrayList<Integer>();
	long start = 0;

	JLabel labSz = new JLabel("", JLabel.RIGHT);
	JLabel labDauer = new JLabel("", JLabel.RIGHT);
	JLabel labFree = new JLabel("", JLabel.RIGHT);
	JLabel labTotal = new JLabel("", JLabel.RIGHT);
	JLabel labMax = new JLabel("", JLabel.RIGHT);


	public void setMemText() {
		synchronized (array) {
			labSz.setText(String.format("%,d	", array.size()));
		}
		long dauer = (System.currentTimeMillis() - start) / 1000;
		long hour = dauer / 3600;
		long minute = (dauer % 3600) / 60;
		long second = dauer - hour * 3600 - minute * 60;
		labDauer.setText(String.format("%02d:%02d:%02d", hour, minute, second));
		labFree.setText(String.format("%,d Byte", rt.freeMemory()));
		labTotal.setText(String.format("%,d Byte", rt.totalMemory()));
		labMax .setText(String.format("%,d Byte", rt.maxMemory()));
	}

	class Background extends Thread {
		private boolean isRunning = false;
		private boolean shouldStop = false;

		public Background() {
			btnStart.setText("Stop");
			this.start();
		}

		protected void publish() {
			SwingUtilities.invokeLater(new Thread() {
				public void run() {
					setMemText();
				}
			});
		}

		@Override
		public void run() {
			System.out.printf("Background Thread gestartet\n");
			this.shouldStop = false;
			this.isRunning = true;
			start = System.currentTimeMillis();
			Thread.currentThread().setName("Background");
			int cnt = 0;
			try {
				while (! this.shouldStop) {
					synchronized (array) {
						array.add(array.size());
					}
					if ((cnt++ % 3000) == 0) {
						this.publish();
						Thread.yield();
					}
				}
			} catch (OutOfMemoryError exc) {
				System.out.printf("Houston ... \n");
				exc.printStackTrace();
				SwingUtilities.invokeLater(new Thread() {
					public void run() {
						kill();
					}
				});
			}
			this.isRunning = false;
			System.out.printf("Background Thread beendet\n");
		}

		public void kill() {
			btnStart.setText("Start");
			this.shouldStop = true;
			while (this.isRunning) Thread.yield();
			bg = null;
		}
	};

	ActionListener evtBtnStart = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			if (bg != null) bg.kill();
			 else bg = new Background();
		}
	};

	ActionListener evtBtnClear = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			synchronized (array) {
				array.clear();
				array.trimToSize();
				labSz.setText(String.valueOf(array.size()));
			}
			setMemText();
		}
	};

	ActionListener evtBtnGC = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			rt.gc();
			setMemText();
		}
	};

	ActionListener evtBtnRefresh = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			setMemText();
		}
	};

	public MemoryTester() {
		this.setLayout(new GridLayout(7, 2));
		this.add(new JLabel("Größe ArrayList: ")); this.add(labSz);
		this.add(new JLabel("Dauer: ")); this.add(labDauer);
		this.add(new JLabel("Free Mem: ")); this.add(labFree);
		this.add(new JLabel("Total Mem: ")); this.add(labTotal);
		this.add(new JLabel("Max Mem: ")); this.add(labMax);
		this.add(btnStart);
		this.add(btnClear);
		this.add(btnGC);
		this.add(btnRefresh);
		btnStart.addActionListener(evtBtnStart);
		btnClear.addActionListener(evtBtnClear);
		btnGC.addActionListener(evtBtnGC);
		btnGC.addActionListener(evtBtnRefresh);
		this.labSz.setText(String.valueOf(array.size()));
		this.setMemText();
		this.setTitle("Memory Tester");
		this.setSize(new Dimension(250, 200));
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new MemoryTester();
	}
}

Mal so 2 Fragen am Rande:
1. Wieso verschluckt SwingWorker sämtliche Exceptions? Das sieht echt merkwürdig aus, wenn der Thread plötzlich ohne jede Meldung beendet wird ...
2. String.format("%tH", 0L) ergibt "01"? :bahnhof:
 

boesi

Aktives Mitglied
SlaterB hat gesagt.:
2.

00:00 in England ist 01.00 in Deutschland
Also das Thema locale&co. ist für mich zwar ein Buch mit 7 Siegeln, aber aus der Java-Doc:
The following conversion characters are used for formatting times:

'H' '\u0048' Hour of the day for the 24-hour clock, formatted as two digits with a leading zero as necessary i.e. 00 - 23. 00 corresponds to midnight.
...
Das was du meinst, bezieht sich sicher auf die Angabe im 12-Stunden-Format, die erfolgt aber mit I oder l - also die Zeichen sind ja mal echt genial gewählt - großes i und kleines L - könnte sich ja jemand fragen wo die führende 0 hin is oder herkommt ...
 
S

SlaterB

Gast
> könnte sich ja jemand fragen wo die führende 0 hin is oder herkommt ...

->

> formatted as two digits with a leading zero as necessary i.e. 00 - 23. 00 corresponds to midnight.

?!


Rest habe ich nicht verstanden, falls da ne Frage drin war,
vielleicht auch ganzes Post nur rethorisch ;)
 
M

maki

Gast
Jetzt hab ich durch ein Speicherleck aber festgestellt, dass die Grenze von 256MB schlicht nicht beachtet wird. Stattdessen kommt die OutOfMemory Exception erst bei über 300MB. Das Leck hab ich inzwischen gefunden.
Xmx steuert nur den Heap, nicht den "insgesamten Speicherverbrauch", die PermGen zB. muss eigenständig eingestellt werden.
 

boesi

Aktives Mitglied
SlaterB hat gesagt.:
Rest habe ich nicht verstanden, falls da ne Frage drin war,
vielleicht auch ganzes Post nur rethorisch ;)
da waren sogar 2 Fragen drin und eine davon rhetorisch :wink:

1. Deine Aussage, dass 00 in England 01 in Deutschland wäre, hatte ich so verstanden, dass du das 24h Format mit dem 12h Format verwechselst - aber das ist ja vollkommener Quatsch - 01:00 ist in beiden Formaten 1h nach Mitternacht...
Dass das ganze aber mit unterschiedlichen Zeitzonen zusammenhängt ... jedenfalls löst die folgende Zeile das Problem mehr oder weniger:
Code:
System.setProperty("user.timezone", "GMT");

2. Die rhetorische Frage: Beim Stöbern in der Doku sind mir die beiden "conversion characters" großes i und kleines L aufgefallen - bedeuten FAST das gleiche und sehen sich ÜBERHAUPT nicht ähnlich - das ist zwar letztendlich eher trivial, gehört aber IMO zu der Sorte von Fehlern wo man ewig nach suchen kann ...
 

boesi

Aktives Mitglied
maki hat gesagt.:
Xmx steuert nur den Heap, nicht den "insgesamten Speicherverbrauch", die PermGen zB. muss eigenständig eingestellt werden.
Langsam sickert bei mir die Erkenntnis durch :###
Die Klasse ManagementFactory gibt da noch ne ganze Menge an Infos her ...

Dumm ist nur, das nun mein Spieltrieb geweckt ist - wie soll ich denn da morgen wieder das Arbeiten anfangen? ???:L

Äh ja *auf die Uhr schiel* verdammt ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Druck Problem: Auflösung des Druckers wird nicht beachtet Allgemeine Java-Themen 2
kodela ArrayList wird nicht komplett gespeichert Allgemeine Java-Themen 3
kodela HelpSet wird nicht gefunden Allgemeine Java-Themen 8
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
F Scrollbar wird nicht angezeigt Allgemeine Java-Themen 0
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
kodela Klassen Klassenvariable wird nicht gesetzt Allgemeine Java-Themen 23
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Java wird nicht gefunden Allgemeine Java-Themen 32
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
B Abfragenteil wird nicht aufgerufen Allgemeine Java-Themen 2
G Tabelle wird nicht richtig dargestellt Allgemeine Java-Themen 9
HarleyDavidson Threads ProgressMonitor wird nicht angezeigt! Allgemeine Java-Themen 6
gamebreiti Swing JLabel wird nicht angezeigt Allgemeine Java-Themen 4
E Java Editor Klasse wird nicht weiter ausgeführt Allgemeine Java-Themen 4
I Datei wird nicht richtig gelöscht Allgemeine Java-Themen 7
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
D Input/Output Datei wird lokal aber nicht vom Webserver ausgelesen... Allgemeine Java-Themen 2
F Nach Export wird PDF Datei nicht mehr gefunden Allgemeine Java-Themen 0
I Projekt wird nicht erstellt Allgemeine Java-Themen 2
J batch datei wird nicht aufgerufen Allgemeine Java-Themen 11
M Datei wird nicht vollständig geschrieben (FileOutputStream, OutputStreamWriter, Encoding) Allgemeine Java-Themen 6
P OSGi - Bundle-Methode wird nicht aufgerufen Allgemeine Java-Themen 3
S Antlr Grammatik übersetzt ohne Fehler, dennoch wird Zahl nicht als Eingabe erkannt Allgemeine Java-Themen 4
T Variablen Variable wird als nicht genutzt angezeigt Allgemeine Java-Themen 8
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
I Main wird nicht gefunden Allgemeine Java-Themen 3
C E-Mail: Authenticator.getPasswordAuthentication() wird nicht gerufen Allgemeine Java-Themen 2
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
M Klassenvariable wird nicht überschrieben. Allgemeine Java-Themen 5
Z Überschriebene setSelected() in ButtonGroup wird nicht aufgerufen Allgemeine Java-Themen 2
E JTable wird nicht angezeigt Allgemeine Java-Themen 11
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
C Datei in Jar-File wird nicht gefunden Allgemeine Java-Themen 10
C blueJ: Objekt wird nicht in Objektleiste angezeigt Allgemeine Java-Themen 8
C Variablenwert wird nicht richtig zurückgegeben Allgemeine Java-Themen 8
I File wird in jar scheinbar nicht gefunden Allgemeine Java-Themen 6
P Mail wird nicht gesendet - Muss ich kein PW angeben ? Allgemeine Java-Themen 13
J Webstart (auf Apache) jnlp wird nicht geladen Allgemeine Java-Themen 2
D Webseite wird nicht immer komplett ausgelesen Allgemeine Java-Themen 11
B Umgebungsvariable Variable wird nicht übernommen Allgemeine Java-Themen 4
G AWT Panel wird nicht dargestellt Allgemeine Java-Themen 3
G Problem Java Mail API: CC wird nicht berücksichtigt Allgemeine Java-Themen 7
L JTextfield wird nicht ausgelesen Allgemeine Java-Themen 7
M repaint() wird nicht ausgeführt Allgemeine Java-Themen 5
C log4j.properties wird nicht verwendet?? Allgemeine Java-Themen 3
J Swing Wird invisible, nicht-ref. Fenster vom GC entfernt? Allgemeine Java-Themen 11
I Eclipse mp3 wird im Jar-File nicht gefunden Allgemeine Java-Themen 8
P Datei aus Ordner wird nicht gelesen Allgemeine Java-Themen 2
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
H List wird nicht richtig gefüllt Allgemeine Java-Themen 6
M javac wird offenbar nicht gefunden Allgemeine Java-Themen 6
G Hibernate search (Lucene) - Index wird nicht rechtzeitig erzeugt? Allgemeine Java-Themen 2
capgeti batch datei funktioniert nicht! Jar wird nicht gestartet! Allgemeine Java-Themen 3
B Konstruktor wird nicht aufgerufen Allgemeine Java-Themen 4
7 Exception wird nicht aufgefangen Allgemeine Java-Themen 8
D Code wird im Applet nicht ausgeführt. Allgemeine Java-Themen 2
G JProgressBar wird nicht angezeigt. Allgemeine Java-Themen 2
S Objekt synchronisieren, sodass es nicht von mehreren Threads benutzt wird..? Allgemeine Java-Themen 2
G WindowAdapter - Datensatz wird nicht komplett gespeichert Allgemeine Java-Themen 7
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
D [SOLVED] Collection wird nicht richtig per Konstruktor übernommen Allgemeine Java-Themen 8
B Java Applet unter Mac wird nicht angezeigt Allgemeine Java-Themen 6
S [ANT] compiler wird nicht gefunden Allgemeine Java-Themen 6
B Bild wird nicht angezeigt. Allgemeine Java-Themen 10
T [Eclipse Ganymede JEE] Warnung das JAR nicht publiziert wird Allgemeine Java-Themen 2
F Panel wird nicht angezeigt Allgemeine Java-Themen 2
Y ProcessBuilder, Prozess wird gestartet, aber Anwendung nicht Allgemeine Java-Themen 5
D Klasse wird nicht gefunden Allgemeine Java-Themen 3
R if-Anweisung wird angemeckert, andere identische nicht Allgemeine Java-Themen 9
Y JasperReport - SubReport wird nicht angezeigt Allgemeine Java-Themen 13
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
C java media framework - Mikrofon wird nicht gefunden Allgemeine Java-Themen 18
Junktyz In Writer und Outputstream wird teilweise nicht geschrieben Allgemeine Java-Themen 3
B jar - ressourcenfile wird nicht gefunden Allgemeine Java-Themen 2
G Problem mit Quellcode, Eingabe wird nicht angezeigt --HELP-- Allgemeine Java-Themen 2
N Main-Klasse wird beim Aufruf des JARs nicht gefunden Allgemeine Java-Themen 8
G Date wird nicht richtig geparsed Allgemeine Java-Themen 3
G JTable wird nicht richtig aufgebaut Allgemeine Java-Themen 9
G Thread wird nicht beendet Allgemeine Java-Themen 5
P javac wird nicht nicht gefunden Allgemeine Java-Themen 33
G Klasse wird zur Laufzeit nicht gefunden? Allgemeine Java-Themen 3
C Das Währungssymbol EURO " € " wird nicht angezeigt Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben