最初から確保されるものだと思い込んでいたら、
そういうわけではなかったので自分用に備忘録
理由は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に向けて増加しつつあったので恐らく裏側でページフォールトしてる)、みたいなことが解消できたので個人的には助かった