Я развернул Java-приложение в Heroku, используя следующие параметры vm:
-Xmx300m -Xss512k -XX:MetaspaceSize=100M
Несмотря на это, мое приложение постоянно получает ошибки Error R14 (превышение квоты памяти) от Heroku. Это связано с тем, что занимаемый объем памяти достигает 540 МБ (и квота составляет 512 МБ).
Как приложение Java может занимать более 500 МБ, когда я выделяю ему только 400 МБ в аргументах виртуальной машины? Я пропустил аргумент виртуальной машины?
Я ожидаю, что JVM перейдет в режим OOM, прежде чем достигнет 512 МБ памяти (но она просто увеличивается за пределы установленных мною ограничений).
Возможно, я совершенно неправильно понял, как работают эти аргументы виртуальной машины?
Любая помощь в этом будет очень признательна.
Заметки:
- я использую джаву 8
мой procfile выглядит следующим образом:
web: java -Xmx300m -Xss512k -XX:MetaspaceSize=100M -javaagent:./lib/heroku-javaagent-2.0.jar=stdout=true,lxmem=true -Dserver.port=$PORT -Dspring.profiles.active=heroku -cp ./app.jar org.springframework.boot.loader.JarLauncher
Приведенный выше Java-агент выдает в логах следующие данные:
Dec 13 11:45:54 app/web.1: measure.mem.jvm.heap.used=177M measure.mem.jvm.heap.committed=212M measure.mem.jvm.heap.max=273M
Dec 13 11:45:54 app/web.1: measure.mem.jvm.nonheap.used=129M measure.mem.jvm.nonheap.committed=132M measure.mem.jvm.nonheap.max=0M
Dec 13 11:45:54 app/web.1: measure.mem.jvm.direct.used=0M measure.mem.jvm.direct.count=0 measure.mem.jvm.direct.capacity=74M
Dec 13 11:45:54 app/web.1: measure.mem.jvm.mapped.used=0M measure.mem.jvm.mapped.count=0 measure.mem.jvm.mapped.capacity=0M
Dec 13 11:45:54 app/web.1: measure.mem.linux.vsz=5817M measure.mem.linux.rss=543M
measure.mem.jvm.nonheap.used=129M
, что означает, что используется 129 МБ памяти вне кучи, для которой не важны ограничения кучи. Память вне кучи может использоваться прямымиByteBuffers
, файлами с отображением памяти и т.п. Считает ли heroku, что квота включает память, которую JVM использует в дополнение к приложению, или только приложение? - person Kayaman   schedule 13.12.2017