Zauważyłem, że aplikacja Spring Boot nie przestrzega ilości pamięci ustawionej za pomocą opcji Xmx. Na przykład: java -jar -Xss64m -Xmx64m test.jarZużycie pamięci rozruchowej wzrasta poza opcję -Xmx
ja również drukowane na konsoli ilość pamięci rzeczywiście używany przez aplikację przy starcie i pokazuje: Max Pamięć: 61M
long maxBytes = Runtime.getRuntime().maxMemory();
System.out.println("Max memory: " + maxBytes/1024/1024 + "M");
Kiedy Otwieram procesy systemu Windows przed uzyskaniem dostępu do dowolnej strony internetowej, pokazuje ona +105M, więc w jaki sposób Java może powiedzieć 61M?
Po uzyskaniu dostępu do dowolnej strony internetowej przechodzi od +125M do + -135M. Dlaczego jest taki wzrost? Powinien dać "java.lang.OutOfMemoryError: PermGen space", ale nie zwiększać w ten sposób.
To mnie martwi, jeśli w wielu aplikacjach zabraknie pamięci na serwerze. Nawiasem mówiąc, używam Java 1.8_45
Powinieneś przeczytać o modelu pamięci Java, szczególnie o zmianach w JRE 8. Xmx określa rozmiar sterty, a nie PermGen. W Javie 8, PermGen zwiększa się dynamicznie, jeśli to konieczne. Ponadto pamięć, którą program faktycznie używa, oraz pamięć zablokowana przez system operacyjny, może być inna. – dunni
Ok, ale PermGen wykracza poza Xmx, więc? Nie mogę ustawić więcej PermGen max w JVM 8 –
Jak już powiedziałem, przy Xmx ustawiasz maksymalny rozmiar przestrzeni sterty, która jest całkowicie niezależna od przestrzeni permg. W przypadku języka Java 8 permgen został faktycznie usunięty i zastąpiony przez MetaSpace, który przydziela potrzebną przestrzeń bezpośrednio z pamięci macierzystej. Istnieje jednak jedna opcja, w której można ustawić maksymalny rozmiar MetaSpace. Więcej informacji można znaleźć w tym artykule: http://java.dzone.com/articles/java-8-permgen-metaspace – dunni