10 ตัวเลือก JVM สำคัญสำหรับระบบแอปพลิเคชันการผลิต JAVA

ทำความรู้จักกับตัวเลือก JVM (Java Virtual Machine) ที่จำเป็นเพื่อประสิทธิภาพที่ดีขึ้นและการดีบัก.


หากคุณเป็นผู้พัฒนา Java หรือผู้ดูแลระบบมิดเดิลแวร์คุณควรทราบว่าตัวเลือก JVM นั้นมีความสำคัญอย่างไรและมีผลกระทบต่อแอปพลิเคชันของคุณอย่างไร มาหาพวกเขากัน.

ภาพรวมตัวเลือก JVM

เมื่อพูดถึงตัวเลือก JVM จากนั้นมีตัวเลือกสามประเภทที่คุณสามารถรวมไว้ในตัวเลือก JVM แบบมาตรฐานแบบไม่มาตรฐานและขั้นสูง หากคุณลองใช้ตัวเลือกขั้นสูงคุณจะใช้ตัวเลือกกับ -XX หากคุณใช้ตัวเลือกที่ไม่เป็นมาตรฐานคุณจะใช้ -X ตัวเลือกมาตรฐานไม่ได้เติมอะไรให้กับตัวเลือก.

แอปพลิเคชันของคุณใช้ตัวเลือก JVM ใด?

หากแอปพลิเคชันทำงานบน Linux คุณสามารถใช้ ps -ef | grep java เพื่อระบุกระบวนการ Java และดูที่ตัวเลือก JVM ที่พิมพ์เป็นอาร์กิวเมนต์ของกระบวนการ หากมีกระบวนการ Java เกิดขึ้นมากกว่าหนึ่งระบบคุณอาจต้องใช้คำหลักที่เป็นเอกลักษณ์ของแอปพลิเคชัน Java ของคุณ.

หากอาร์กิวเมนต์ของคุณยาวเกินไปให้ลองใช้ ps -auxww เนื่องจากคำสั่งนี้จะแสดงรายการอาร์กิวเมนต์ที่ยาวเช่นกัน.

หลังจากมีรายการธง JVM คุณสามารถรับแนวคิดเกี่ยวกับพฤติกรรมของแอปพลิเคชัน Java ใด ๆ เช่น Tomcat.

ขนาดฮีป Java

 -XMS – กำหนดขนาดฮีพ Java เริ่มต้น
-xmx – กำหนดขนาดฮีพ Java สูงสุด
-XSS – ตั้งค่าขนาดสแต็กของเธรด Java

-Xms – ตัวเลือกนี้คือการกำหนดขนาดฮีปเริ่มต้นสำหรับ JVM เช่น Xms2048m ซึ่งหมายถึงขนาดฮีปเริ่มต้นของ JVM คือประมาณ 2 GB ดังนั้นเมื่อ JVM เริ่มต้นหน่วยความจำฮีปจะใหญ่มาก น่าแปลกที่ใช่! สิ่งนี้ดำเนินการเพื่อป้องกันการปรับขนาดในระหว่างการเริ่มต้นและปรับปรุงเวลาเริ่มต้นของ JVM.

-Xmx – ตัวเลือกนี้เพื่อกำหนดขนาดฮีปสูงสุดของ JVM เช่น Xmx2048m ซึ่งหมายความว่าขนาดฮีปสูงสุดของ JVM จะเป็น 2 GB เท่านั้น.

คุณจะต้องมี -Xmsand-Xmx ด้วยกันเสมอ.

กำหนดเปอร์เซ็นต์ของกอง

-XX: MaxHeapFreeRatio – ตั้งค่าเปอร์เซ็นต์สูงสุดของฮีปฟรีหลังจาก GC เพื่อหลีกเลี่ยงการหดตัว.

-XX: MinHeapFreeRatio – ตั้งค่าเปอร์เซ็นต์ขั้นต่ำของฮีปฟรีหลังจาก GC เพื่อหลีกเลี่ยงการขยายตัว เพื่อตรวจสอบการใช้ฮีปคุณสามารถใช้ JCosole.

เปิดใช้งานการแชร์ข้อมูลในชั้นเรียน

ระบุตัวเลือก Xshareclasses เพื่อเปิดใช้งานการแชร์ข้อมูลระดับในแคชคลาสที่แชร์ JVM เชื่อมต่อกับแคชที่มีอยู่หรือสร้างแคชหากไม่มีอยู่ คุณสามารถมีหลายแคชและคุณสามารถระบุแคชที่ถูกต้องโดยการเพิ่มตัวเลือกย่อยในตัวเลือก -Xshareclasses.

ขนาด PermGen

ตัวเลือก JVM ก่อนหน้านี้กำหนดขนาดของหน่วยความจำฮีป แต่ -XX: PermSize คือการกำหนดขนาดของพื้นที่ PermGen โดยที่สตริงพูลและข้อมูลเมตาของคลาสจะถูกบันทึก ตัวเลือกนี้มีประสิทธิภาพเป็นพิเศษสำหรับเว็บเซิร์ฟเวอร์เช่น Tomcat ซึ่งมักจะโหลดคลาสของเว็บแอปพลิเคชันระหว่างการปรับใช้.

อย่างไรก็ตามเป็นเรื่องที่ควรค่าแก่การตระหนักว่าพื้นที่ PermGen ถูกครอบครองโดย Metaspace ใน Java 8 และตัวเลือกนี้ไม่สามารถใช้ได้หากคุณใช้งาน JRE 8 JVM.

พิมพ์ GC

-verbose: GC – บันทึกตัวรวบรวมขยะรันและระยะเวลาที่ใช้.
-XX: + PrintGCDetails – รวมถึงข้อมูลจาก – verbose: gc แต่ยังเพิ่มข้อมูลเกี่ยวกับขนาดของคนรุ่นใหม่และการกำหนดเวลาที่แม่นยำยิ่งขึ้น.
-XX: -PrintGCTimeStamps – พิมพ์การประทับเวลาที่การรวบรวมขยะ.

ตัวเลือก JVM เหล่านี้ใช้เพื่อเปิดใช้งานการบันทึกการรวบรวมขยะซึ่งมีประสิทธิภาพสูงสำหรับการดำเนินการที่มีความอ่อนไหว เราเคยอยู่ในระบบที่เราค้นหาเวลาไมโครวินาทีและถ้าคุณจำการรวบรวมขยะขนาดใหญ่อาจใช้เวลาหลายมิลลิวินาที.

ดังนั้นเราจึงเลือกใช้สถาปัตยกรรมฟรีของ GC เช่น LMAX disruptor แต่ถ้าคุณไม่ต้องการแอพพลิเคชั่นที่มีความอ่อนไหวเป็นพิเศษตัวเลือกที่มีประโยชน์นี้จะแนะนำสถิติ GC ที่สำคัญแก่คุณ คุณจะได้รับไม่ว่าจะเป็นคอลเล็กชั่นขยะขนาดใหญ่หรือเล็กประเภทของตัวเก็บขยะที่ใช้ความถี่หน่วยความจำจะถูกกู้คืนและเวลาที่เก็บเป็นต้น.

การจัดการข้อผิดพลาด ‘OutOfMemory’

ในการทริกเกอร์การกองทิ้งฮีปจากหน่วยความจำไม่เพียงพอคุณสามารถใช้ -XX: + HeapDumpOnOutOfMemoryError

ตัวเลือก JVM นี้สร้างสแต็คดัมพ์เมื่อ JVM ของคุณตายด้วยข้อผิดพลาด OutOfMemory ไม่มีค่าใช้จ่ายใด ๆ ที่เกี่ยวข้องกับ OOM เว้นแต่จะเกิดขึ้นจริง การตั้งค่าสถานะนี้เป็นสิ่งจำเป็นสำหรับระบบการผลิตเนื่องจากเป็นวิธีเดียวที่จะระบุปัญหาได้อย่างลึกซึ้ง.

ดัมพ์ฮีปจะถูกตั้งค่าใน “ไดเร็กทอรีปัจจุบัน” ของ JVM โดยดีฟอลต์ หากคุณต้องการสร้างทิ้งกองในไดเรกทอรีที่เฉพาะเจาะจงแล้วเรียกใช้

-XX: HeapDumpPath = [ไดเรกทอรีไปยังฮีป – ถ่ายโอนข้อมูลไดเรกทอรี]
-XX: + UseGCOverheadLimit
-XX: OnOutOfMemoryError ="< cmd args >;< cmd args >"

ไฟล์ดัมพ์ฮีปมีขนาดใหญ่มากถึงกิกะไบต์ดังนั้นมั่นใจได้ว่าระบบไฟล์เป้าหมายอนุญาตความจุที่เพียงพอ.

หากเราต้องการรีสตาร์ทเซิร์ฟเวอร์ทันทีหลังจากหน่วยความจำไม่เพียงพอเกิดขึ้นเราสามารถตั้งค่าพารามิเตอร์นี้โดยมีวัตถุประสงค์เดียวกัน –

XX: OnOutOfMemoryError ="ปิด -r"

ติดตามการโหลดคลาสและยกเลิกการโหลด

-XX: + TraceClassLoading และ -XX: + TraceClassUnloading เป็นสองตัวเลือก JVM ที่เราใช้พิมพ์ข้อมูลการบันทึกเมื่อใดก็ตามที่คลาสโหลดเข้าสู่ JVM หรือยกเลิกการโหลดจาก JVM แฟล็ก JVM เหล่านี้มีประโยชน์หากคุณมีหน่วยความจำรั่วไหลใด ๆ ที่เชื่อมโยงกับ classloader และสงสัยว่าคลาสนั้นไม่ได้ทำการขนถ่ายหรือเก็บขยะ.

Java classpath

เมื่อพูดถึง JAVA Classpath แล้ว Xbootclasspath จะระบุรายการ classpath ที่เราต้องการโหลดโดยไม่ต้องมีการตรวจสอบ JVM ตรวจสอบคลาสทั้งหมดที่โหลดเพื่อให้แน่ใจว่าไม่ได้พยายามตรวจสอบวัตถุที่มีรายการ int, pop ของรายการพิเศษออกจากสแต็กหรือกดมากเกินไปเป็นต้น. 

การวางคลาสบน bootclasspath จะข้ามค่าใช้จ่ายเช่นกัน แต่ควรใช้เฉพาะเมื่อคุณทราบว่าคลาสนั้นได้รับการตรวจสอบหลายครั้งก่อนหน้านี้ ใน JRuby นี่เป็นการลดเวลาเริ่มต้นลงครึ่งหนึ่งสำหรับสคริปต์ง่าย ๆ.

โปรไฟล์

Java Profiling เป็นกระบวนการของการตรวจสอบพารามิเตอร์ระดับ JVM ต่างๆเช่นการดำเนินการตามวิธี, การดำเนินการเธรด, การรวบรวมขยะและการสร้างวัตถุ Java Profiling ให้มุมมองที่ละเอียดยิ่งขึ้นเกี่ยวกับการเรียกใช้แอปพลิเคชันเป้าหมายและการใช้ทรัพยากร.

-Xprof
-Xrunhprof

สภาพแวดล้อม 64 บิต

ในสภาพแวดล้อมระบบปฏิบัติการที่ติดตั้งแพ็คเกจทั้ง 32 และ 64 บิต JVM จะเลือกแพ็คเกจสิ่งแวดล้อม 32 บิตโดยอัตโนมัติเป็นค่าเริ่มต้น.

หากเราต้องการตั้งค่าสภาพแวดล้อมเป็น 64 บิตด้วยตนเองเราสามารถทำได้โดยใช้พารามิเตอร์ -d และเห็นได้ชัดว่าระบบปฏิบัติการบิตสามารถเป็น 32 หรือ 64.

ข้อสรุป

ฉันหวังว่านี่จะช่วยให้คุณกำหนดค่าพารามิเตอร์ JVM สำหรับแอปพลิเคชันของคุณ หากคุณสนใจที่จะเรียนรู้เชิงลึกเกี่ยวกับการจัดการหน่วยความจำ java ลองดูสิ่งนี้ แน่นอน Udemy.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map