Mam serwer z systemem Solaris 10. Zgłasza ponad 70 GB wolnej pamięci RAM GiB. Próbuję uruchomić Tomcat 7.0.68 przy użyciu Java 1.7.0_80 w trybie 64-bitowym.
Serwer twierdzi, że nie jest w stanie przydzielić 717 MiB pamięci RAM. Za każdym razem, gdy próbuję, otrzymuję plik hs_err_pidxxx.log. Sugeruje to:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 717225984 bytes for committing reserved memory.
# Possible reasons:
# The system is out of physical RAM or swap space
Nie. Dostępnych jest 70 GiB, próbuje przydzielić 700ish MiB.
# In 32 bit mode, the process size limit was hit
Jesteśmy w trybie 64-bitowym.
# Possible solutions:
# Reduce memory load on the system
Na tym komputerze nie ma nic poza systemem operacyjnym.
# Increase physical memory or swap space
Mamy już dwa rzędy wielkości więcej niż potrzeba.
# Check if swap backing store is full
Nie.
# Use 64 bit Java on a 64 bit OS
Gotowy.
# Decrease Java heap size (-Xmx/-Xms)
Zrobiłbym, gdybym mógł.
# Decrease number of Java threads
Jak to się robi?
# Decrease Java thread stack sizes (-Xss)
Sugerowane wartości? Jest to domyślnie, ale nie wiem, co to może poprawić.
# Set larger code cache with -XX:ReservedCodeCacheSize=
Ponownie jesteśmy domyślnie.
$ swap -s
total: 48607296k bytes allocated + 18201336k reserved = 66808632k used, 311770552k available
echo ::memstat | mdb -k
uruchamiane jako root?Odpowiedzi:
Wolna pamięć RAM oznacza po prostu, że nie ma w niej nic. To nie znaczy, że możesz z niego korzystać. Zgłoszona pamięć RAM jest całkowicie możliwa i nie nadaje się do użytku przez nową maszynę JVM, ponieważ zarezerwowały ją inne aplikacje. W każdym razie JVM, podobnie jak większość aplikacji, nie prosi o pamięć RAM, ale o pamięć wirtualną. Jest to bardziej niż prawdopodobne, że problem dotyczy twojego systemu, brak pamięci wirtualnej.
Dzięki temu poleceniu poznasz użycie pamięci wirtualnej:
Prostą odpowiedzią na niedobór pamięci wirtualnej jest po prostu zwiększenie (lub utworzenie) obszaru wymiany, aby rezerwacje pamięci miały obszar magazynu kopii zapasowych.
Edycja: dzięki opublikowanym dodatkowym informacjom powodem, dla którego aplikacja nie może przydzielić więcej pamięci wirtualnej, jest fakt, że działasz w strefie nieglobalnej, w której obowiązuje ograniczenie pamięci. Strefy nieglobalne są kontenerami, tzn. Wszystkie mają to samo jądro. Jednak ich wykorzystanie zasobów może być ograniczone, aby jedna strefa nie zakłócała innych.
Poza zatrzymywaniem innych procesów korzystających z pamięci wirtualnej nie można nic zrobić z tej strefy, nawet jako root. Musisz poprosić administratora strefy globalnej o przyznanie więcej pamięci wirtualnej dla twojej strefy , w twoim przypadku
zone.max-swap
ustawienie.źródło
zonename
pokazuje?