![]()
ปัญหาที่มักพบเจอเกี่ยวกับการสร้าง Container สำหรับ JVM คือ
การกำหนดขนาดของ memory ให้นั่นเอง ซึ่งพบว่า
ถึงแม้จะกำหนดขนาดของ memory ตอนสร้าง container ไปแล้ว
แต่ตัว JVM มันก็ยังมีค่าของ
Max Heap Size (Estimated) เป็นค่าที่สูงกว่า
ตัวอย่างเช่น
[gist id="df4d754001b4c2a5b5db33d9c164a43d" file="1.txt"]
คำอธิบาย
กำหนดขนาด memory ของ container ให้ที่ 100 M
แต่ Heap Size ดันไปที่ 444.50M ??
ลองคิดดูสิว่า ถ้าเราดันไป run ระบบงานของเราด้วย java ปกติ
แน่นอนว่าเดี๋ยว JVM ใน container นี้โดน terminate แน่นอน ++
ปล. ปกติแล้วค่า default ของ Max Heap Size จะอยู่ที่ 1 ใน 4 ส่วนของหน่วยความจำหลัก !!
วิธีการแก้ไขปัญหานี้ คือ ทำการเพิ่ม option สำหรับ JVM ไปนิดหน่อย
เพื่อกำหนดขอบเขตของการจอง memory ของ Heap นั่นเอง ดังนี้
[gist id="df4d754001b4c2a5b5db33d9c164a43d" file="2.txt"]
จะเห็นได้ว่า Max Heap ไม่เกินหน่วยความจำที่กำหนดให้แต่ละ container แล้ว
แต่มันใช้ไปประมาณ 2 ใน 4 เลยนะ
ดังนั้นลองกำหนดขนาดของ memory สำหรับ container สัก 1 GB สิ
[gist id="df4d754001b4c2a5b5db33d9c164a43d" file="3.txt"]
ผลที่ได้คือ จองหน่วยความจำไป 1 ใน 4 จริง ๆ นะ
ถ้าต้องการให้ JVM จอง memory ทั้งหมด
สามารถใส่ -XX:MaxRAMFraction=1 เขาไปเพิ่มได้
[gist id="df4d754001b4c2a5b5db33d9c164a43d" file="4.txt"]
ดังนั้นการ configuration ค่าต่าง ๆ ของ JVM จึงมีความสำคัญมาก ๆ
ปล. ใช้ memory เยอะจริง ๆ นะ
Reference Websites
https://dzone.com/articles/running-a-jvm-in-a-container-without-getting-kille