JVM Options เบื้องต้นมีอะไรบ้าง?

Phayao Boonon
2 min readNov 13, 2018

--

Photo by Fancycrave on Unsplash

หลังจากที่เราได้รู้การทำงานของ JVM ไปแล้ว ก็อาจจะสงสัยว่าเราสามารถปรับแต่ง JVM ในขณะทำงานได้ไหม ซึ่ง JVM ก็มี option ที่เป็น Standard Options, Non-standard Options และ Advance Option ให้สำหรับปรับแต่งการทำงานดังนี้

Standard Options

เราสามารถใช้คำสั่ง java เพื่อแสดงรายการ option มาตรฐานของ JVM สามารถเลือกใช้งานได้ตามที่ต้องการ โดยที่ option สำคัญดังนี้

-Dproperty=value

เป็นการตั้งค่า property ของระบบ ตัวแปร property เป็น String ที่ไม่มีช่องว่างหลังจาก -D (Define) แทนที่ชื่อของ property และตัวแปร value เป็น String แทนทีค่าของ property ถ้ามีช่องว่างระหว่างคำจะต้องมีเครื่องหมาย “” กำกับ (ตัวอย่างเช่น -Dfoo="foo bar")

-server

เป็นการเลือก Hotspot Server VM ซึ่ง JDK เวอร์ชัน 64bit เท่านั้นที่รองรับ option นี้

-client

เป็นการเลือก Hotspot Client VM ถ้าเป็น JDK เวอร์ชัน 64bit จะไม่รองรับ option นี้ แต่ใช้ Hotspot Server VM แทน

-d32/-d64

เป็นการระบุว่าจะให้ JVM ทำงานในโหมด 32bit หรือ 64Bit แต่โดยค่าเริ่มต้นจะรันแอพพลิเคชันในโหมด 32bit เว้นแต่ระบบ 64bit ถูกใช้งาน ตอนนี้มีเพียง Hotspot VM ที่รองรับ 64bit และถ้าใช้ option -server จะใช้งาน -d64 โดยปริยาย แต่ถ้าใช้ -client จะไม่ใช้งาน -d64

Non-Standard Options

เราสามารถใช้คำสั่ง java -X เพื่อแสดงรายการของ option เฉพาะของ JVM นั้นๆ และ option ที่สำคัญดังนี้

-Xint

เป็นการรันแอพพลิเคชันในโหมด interpreted-only ซึ่งการใช้งาน native code จะถูกปิดการใช้งาน และ bytecode จะถูกประมวลผลด้วย interpreter การใช้งาน JIT เพื่อเพิ่มประสิทธิภาพการประมวลผลจะไม่เห็นผลในโหมดนี้

-Xbootclasspath:path

เป็นการระบุรายการของ directory ที่มีไฟล์ JAR และ ZIP โดยแยกด้วย : เพื่อหาไฟล์คลาส boot loader

-Xloggc:filename

เป็นระบุไฟล์ซึ่งเก็บข้อมูลของ verbose GC event สำหรับ logging โดยที่ข้อมูลจะถูกเขียนไปในไฟล์เหมือนกับที่แสดงใน output ของ -verbose:gc ซึ่ง -Xloggc จะแทนที่ -verbose:gc ถ้าใส่มาในคำสั่งชุดเดียวกัน

-Xmssize

เป็นการระบุค่าเริ่มต้นของขนาดของ Heap (หน่วยเป็น byte) เป็นค่าผลคูลของ 1024 และมากกว่า 1 MB ต่อท้ายด้วยตัวอักษรที่บ่งบอกว่าเป็นหน่วย, k หรือ K เป็นหน่วย kilobyte, m หรือ M เป็นหน่วย megabyte, g หรือ G เป็นหน่วย gigabyte ตัวอย่างต่อไปนี้เป็นการระบุค่า 6 MB

-Xms6291456
-Xms6144k
-Xms6m

ถ้าไม่ระบุ option นี้ขนาดเริ่มต้นของ Heap จะเป็นค่าของผลรวมของขนาดที่ allocate สำหรับ old generation และ young generation, -Xms

-Xmxsize

เป็นการระบุค่ามากที่สุดของขนาดของ Heap (หน่วยเป็น byte) ป็นค่าผลคูลของ 1024 และมากกว่า 2 MB ต่อท้ายด้วยตัวอักษรที่บ่งบอกว่าเป็นหน่วย, k หรือ K เป็นหน่วย kilobyte, m หรือ M เป็นหน่วย megabyte, g หรือ G เป็นหน่วย gigabyte ตัวอย่างต่อไปนี้เป็นการระบุค่า 80 MB

-Xmx83886080
-Xmx81920k
-Xmx80m

โดยเริ่มต้นจะใช้ค่าที่ถูกเลือกในขณะ runtime ซึ่งเป็นค่าของ system configuration

-Xnoclassgc

เป็นการปิดการทำงานของ Garbage Collection ของคลาส สามารถประหยัดเวลาขอ GC บ้าง ซึ่งทำให้ interrupt สั้นลงในขณะทำงานของแอพพลิเคชัน

Advance Options

นอกจาก Standard Option และ Non-Standard Option แล้วก็ยังมี option อื่นๆ อีกที่เป็นระดับสูง ซึ่งแบบได้ดังนี้

Behavior

-XX:+UseConcMarkSweepGC

สำหรับเปิดใช้งาน CMS Garbage Collection

-XX:+UseParallelGC

สำหรับเปิดใช้งาน Parallel Garbage Collection

-XX:+UseSerialGC

สำหรับเปิดใช้งาน Serial Garbage Collection

-XX:+UseG1GC

สำหรับเปิดใช้งาน G1 Garbage Collection

Performance

-XX:MaxPermSize=size

เป็นการระบุขนาดสูงสุดของ permanent generation space (หน่วยเป็น byte)

-XX:ThreadStackSize=size

เป็นการระบุขนาดของ thread stack (หน่วยเป็น byte)

-XX:+UseStringCache

เปิดใช้งานการ caching ของ commonly allocated strings

-XX:G1HeapRegionSize=size

เป็นการระบุขนาดของ sub-division ของ G1 Heap (หน่วยเป็น byte)

-XX:MaxGCPauseMillis=time

เป็นการระบุเวลานานที่สุดของการหยุดของ Garbage Collection

-XX:MaxNewSize=size

เป็นการระบุขนาดสูงสุดของ Heap สำหรับ young generation

-XX:+AggressiveOpts

เปิดใช้งาน aggressive performance optimization features

-XX:OnError=string

เป็นการระบุคำสั่งให้ทำงานเมื่อมี Error เกิดขึ้น

Debugging

-XX:ErrorFile=filename

เป็นการระบุ path และชื่อไฟล์ของ Error log

-XX:+HeapDumpOnOutOfMemory

เปิดใช้งาน dump ไฟล์ของ Java Heap ไปเป็นไฟล์ใน directory ที่ทำงานอยู่

-XX:+PrintGC

เปิดใช้งานให้แสดง message ของทุกๆ Garbage Collection

-XX:+TraceClassLoading

เปิดใช้งาน tract ของคลาสที่โหลดมาแล้ว

-XX:+PrintClassHistogram

เปิดใช้งานแสดงคลาส instance histogram หลังจาก Ctrl+C

--

--

Phayao Boonon
Phayao Boonon

Written by Phayao Boonon

Software Engineer 👨🏻‍💻 Stay Hungry Stay Foolish

No responses yet