wartości Xmx i maxMemory() różnią się

0

W Eclipsie podałem następujące parametry JVM:
-Xmx1000m
-Xms1000m
-XX:PermSize=24m
-XX:MaxPermSize=24m
-Xss10m
-verbose:gc
-XX:+PrintGCDetails
-XX:CMSInitiatingOccupancyFraction=65
-Dsun.rmi.dgc.client.gcInterval=60000

W aplikacji odczytuję:

 
rt = Runtime.getRuntime();
rt.maxMemory()/1024/1024;

I zastanawia mnie dlaczego (uzyskana w MB) wartość pamięci jest różna od żądanej parametrem Xmx. Akurat dla (Xmx=1000, PermSize=MaxPermSize=24, Xss=10 ) otrzymuje 966MB. Generalnie zawsze podawana metodą maxMemory() wartość jest o około 3,5% mniejsza niż by wynikało to z Xmx (bez względu na wartości pozostałych parametrów JVM).

Pytania mam takie:

  • skąd bierze się ta różnica (jak nad nią panować)?
  • jak wyodrębniana jest pamięć przeznaczona na stos, jeśli jest ona przedstawiona tak jak znalazłem w necie - plik załącznika.

P.S. skoro Xms=Xmx to można na coś jeszcze zostawiać pamięć co tłumaczyło by to około 3,5% o które się targuje?

0

Tak: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4391499 to nie jest bug, bo interpretacja -Xmx i maxMemmory zależą od konkretnej implementacji JVM.

0

Więc raczej jasne: zależne od JVM...

A co z parametrem Xss ? normalnie przydzielane z YoungGeneration lub OldGeneration, bo w sumie jaka inna możliwość pozostaje?

0

Tu zależy od GC. Ponieważ w takim np. G1 nie ma czegoś takiego jak generacje. Wróć... Jest, ale inaczej działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1