背景
本番環境のDockerコンテナ上で動作するアプリがメモリリークエラーとなる。
docker statsをすると利用率2gほどで上限となり、そのままメモリリークエラーとなっていた。
Dockerコンテナにログインして、JVMの設定を確認すると、最大ヒープサイズ(MaxHeapSize)が2gとなっていたので、利用率をあげるためにJVMの設定値を変更したいと考えている
※本番環境のサーバーはメモリ8g
※Dockerコンテナ上のJVMのMaxRAMPercentage=25
相談事項
メモリ利用率を上げるために、Dockerファイル上で最大ヒープサイズを指定しました。
しかし、起動したコンテナにログインしてJVMの設定を確認すると、最大ヒープサイズが反映されません。
Dockerファイルの記載や確認の仕方が悪いのでしょうか?以下「やったこと」を確認して、ご意見を伺いたいです。
※docker run時にコンテナに割り当てるメモリを増やすことで、
利用率をあげることができましたが、Dockerファイル上から指定したいと考えています。
作業環境
windows10 pro
やったこと(上から順)
・powershell上で、Dockerファイルからイメージを作成する
docker
1docker build -t samplejvm:1.0 .
・dockerコンテナを起動
docker
1docker run --rm -m 8g --name samplejvm samplejvm:1.0
・別powershellを立ち上げ、コンテナにログイン
docker
1docker exec -it samplejvm /bin/bash
<コンテナ上での作業>
・JVMオプションを確認する
→
最大ヒープサイズの想定は4gだが、実際には2gになる。
※コンテナに割り当てたメモリは8g、Dockerファイル「XX:MaxRAMPercentage」を50%にしたので、4gとなる想定
bash
1java -XX:+PrintFlagsFinal --version | grep MaxHeapSize 2 size_t MaxHeapSize = 2147483648 {product} {ergonomic}
ソースについて
dockerファイル
dockerファイル
1ROM openjdk:11.0-jre 2ARG APP_DIR=/opt/owner-batch 3WORKDIR ${APP_DIR} 4ADD ./tmp/SampleApp.jar ${APP_DIR}/app.jar 5ENTRYPOINT ["sh", "-c", "java -XX:MaxRAMPercentage=50 -jar app.jar" ]
SampleApp.jar
サンプルアプリ。起動すると10秒間待機してHelloWorldを出力する
参考サイト
https://i-beam.org/2019/08/15/jvm-heap-sizing/
https://spring.pleiades.io/guides/topicals/spring-boot-docker
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/13 10:05
2021/04/13 11:15
2021/04/13 13:31
2021/04/15 01:26