2016-02-09 10 views
9

zdałem sobie sprawę, że trzeba przeznaczyć znacznie więcej pamięci niż jest to potrzebne do moich funkcji AWS lambda inaczej uzyskać:AWS Lambda i niedokładne pamięć alokacja

{ 
"errorMessage": "Metaspace", 
"errorType": "java.lang.OutOfMemoryError" 
} 

Na przykład mam funkcji Lambda z 128MB przydzielone, to wywala cały czas z tym błędem, podczas gdy w konsoli mówi "Max memory used 56 MB".
Potem przydzielam 256MB, to już się nie psuje, ale zawsze daje mi "Max używaną pamięć" od 75 do 85 MB.

Jak to możliwe? Dzięki.

+0

Osoba, która oddała głos, może może wyjaśnić przyczynę. –

+0

Po prostu wpadłem na ten sam problem. Czy ktoś wie, dlaczego tak się dzieje? –

+0

Mam podobne problemy –

Odpowiedz

6

Ilość pamięci przydzielonej do funkcji java lambda jest udostępniana przez pamięć sterty, meta i pamięć zarezerwowaną.

Polecenie java wykonywany przez kontener dla funkcji przydzielonej 256M jest coś takiego:

java -XX:MaxHeapSize=222823k -XX:MaxMetaspaceSize=26214k -XX:ReservedCodeCacheSize=13107k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation -jar /var/runtime/lib/LambdaJavaRTEntry-1.0.jar 

222823k + 26214k + 13107k = 256M

Polecenie java wykonywany przez kontener dla funkcji przydzielone 384m jest coś takiego jak

java -XX:MaxHeapSize=334233k -XX:MaxMetaspaceSize=39322k -XX:ReservedCodeCacheSize=39322k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation -jar /var/runtime/lib/LambdaJavaRTEntry-1.0.jar 

334233k + 39322k + 39322k = 384M

Więc formuła wydaje się być

85% kupie + 10% + 5% meta kodu zastrzeżonego cache = 100% pamięci funkcyjnego skonfigurowane

I szczerze nie wiem jak "Memory Max Używane" wartość podawana w dziennikach Cloudwatch jest obliczana. Nie zgadza się z niczym, co widzę.

+0

Dzięki za twój wkład. –

+1

Możesz go znaleźć za pomocą 'ManagementFactory.getRuntimeMXBean(). GetInputArguments()'. –

2

Co się tu dzieje może być jedna z dwóch rzeczy:

  1. Funkcja zawodzi zastrzec dodatkowej pamięci i braku, powodując błąd widzisz, i zachowując pamięć niskie, jak wniosek o więcej spowodował awarię JVM.
  2. Wyczerpujesz tylko Metaprzestrzeń, którą @jstell wskazuje tylko 10% całkowitej pamięci, a korzystasz tylko z 56 MB przestrzeni sterty.

Po przejściu na większy obszar pamięci zwiększa się alokacja metaprzestrzeni, która umożliwia uruchomienie funkcji.