2016-02-09 8 views
9

mi sono reso conto che ho bisogno di allocare più memoria rispetto necessario per le mie funzioni AWS Lambda altrimenti ottengo:AWS Lambda e la memoria imprecisa allocazione

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

Per esempio ho una funzione lambda con 128MB assegnato, si blocca sempre con quell'errore mentre nella console si dice "Max memory used 56 MB".
Quindi alloco 256 MB, non si blocca più ma mi dà sempre una "memoria massima utilizzata" tra 75 e 85 MB.

Come mai? Grazie.

+0

La persona che ha votato potrebbe forse spiegare il motivo. –

+0

Ho appena incontrato lo stesso problema. Qualcuno sa perché questo accade? –

+0

Ho problemi simili –

risposta

6

La quantità di memoria allocata alla funzione java lambda è condivisa da heap, meta e memoria di codice riservata.

Il comando java eseguito dal contenitore per una funzione assegnata 256M è qualcosa di simile:

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

Il comando java eseguito dal contenitore per una funzione assegnata 384M è qualcosa di simile

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

01.235.164,106174 millions

Quindi, la formula sembra essere

85% mucchio + 10% di cache meta + 5% di codice riservati = 100% della memoria funzione configurata

Onestamente non so come la "Memory Max Usato" viene calcolato il valore riportato nei registri di Cloudwatch. Non è allineato con nulla che sto vedendo.

+0

Grazie per l'input. –

+1

Puoi trovarlo con 'ManagementFactory.getRuntimeMXBean(). GetInputArguments()'. –

2

Quello che sta accadendo qui potrebbe essere una delle due cose:

  1. La funzione non riesce a riservare la memoria aggiuntiva e non riuscendo, causa l'errore che si vede, e mantenere la memoria bassa, come la richiesta di più ha causato l'arresto anomalo della JVM.
  2. Stai esaurendo solo il Metaspace, che @jstell indica solo il 10% della memoria totale e stai utilizzando solo 56 MB di spazio heap.

Quando si passa a un ingombro di memoria più grande, si aumenta l'allocazione metaspace, che consente l'esecuzione della funzione.