HackToTech

Hack To Technology

-Xmsと-Xmxを指定しても必ずしもすぐに物理メモリ上で確保されるわけではないという話

最初から確保されるものだと思い込んでいたら、
そういうわけではなかったので自分用に備忘録

理由はStackOverflowで解説されているので、それを読むのが良い stackoverflow.com

どうやらAlwaysPreTouchを指定すると(その分起動は遅くなるが)、
JVMの初期化時に強制的にマッピングされるらしいのでSpringのdemoアプリケーションで試した

AlwaysPreTouchあり

./gradlew bootRun -PjvmArgs="-Xms2g -Xmx2g -XX:+AlwaysPreTouch"

> Task :bootRun

2023-09-24 01:03:59.352  INFO 8070 --- [           main] com.example.demo.DemoApplicationKt       : Starting DemoApplicationKt using Java 11.0.20 on local with PID 8070 (/home/atr0phy/IdeaProjects/demo/build/classes/kotlin/main started by atr0phy in /home/atr0phy/IdeaProjects/demo)
<==========---> 83% EXECUTING [1m 33s]

AlwaysPreTouchなし

./gradlew bootRun -PjvmArgs="-Xms2g -Xmx2g"

> Task :bootRun

2023-09-24 01:05:51.778  INFO 8208 --- [           main] com.example.demo.DemoApplicationKt       : Starting DemoApplicationKt using Java 11.0.20 on local with PID 8208 (/home/atr0phy/IdeaProjects/demo/build/classes/kotlin/main started by atr0phy in /home/atr0phy/IdeaProjects/demo)
<==========---> 83% EXECUTING [3m 32s]

違いはRESを見れば分かる通り、2.2GBと284MBになっている

個人的にはXmsとXmxを同じ値で指定することが多いが、一応↓見た感じXmsのサイズが確保されるらしいとのことだったので、試した stackoverflow.com

一長一短あるので常に指定するのが良いとは限らないが、
起動後に少ししてから大してメモリをまだ使ってないにも関わらず、
GCがはしってCPUの使用率が高くなってレイテンシが悪化する(OS上のメモリの使用量がXmsに向けて増加しつつあったので恐らく裏側でページフォールトしてる)、みたいなことが解消できたので個人的には助かった