2015-06-29 13 views
5

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

+1

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

+0

Ok, ale PermGen wykracza poza Xmx, więc? Nie mogę ustawić więcej PermGen max w JVM 8 –

+0

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

Odpowiedz

6

Po kontroli stosowania Wiosna Boot, dowiedziałem się kilka możliwych przyczyn, takich jak:

  1. Liczba wątków HTTP (Undertow zaczyna się około 50 wątków na Domyślnie ale można zwiększyć/zmniejszyć z urządzeń własności ilość wątków potrzebne)
  2. dostępie do rodzimych procedur (.dll, .so) poprzez JNI
  3. zmienne statyczne
  4. Korzystając z pamięci podręcznej (memcache, ehcache, etc)
  5. Jeśli maszyna wirtualna jest 32-bitowa lub 64-bitowa, 64-bitowa wykorzystuje więcej pamięci do uruchomienia tej samej aplikacji, więc jeśli nie potrzebujesz sterty większej niż 1,5 GB, zachowaj aplikację na poziomie 32-bitowym, aby zaoszczędzić pamięć.
+0

64-bitowy java używa skompresowanych wskaźników (jeśli używasz mniej niż 32 GB xmx), więc nie powinien używać więcej pamięć do uruchomienia tej samej aplikacji? –

Powiązane problemy