เปิดไดเรกทอรีการติดตั้ง IDEA และดูว่ามีไดเรกทอรี BIN ที่มีไฟล์ VMOPTIONS สองไฟล์ซึ่งจำเป็นต้องกำหนดค่าสำหรับ JDK ที่แตกต่างกัน:
32 บิต: idea.exe.vmoptions
64 บิต: Idea64.exe.vmoptions
-Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=225m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true
รายการด้านบนเป็นเนื้อหาเริ่มต้นของ idea64.exe.vmoptions ซึ่งเราสามารถแก้ไขได้ตามต้องการ
ความหมายของแต่ละพารามิเตอร์คือ:
1. ตั้งค่าการตั้งค่าหน่วยความจำ JVM
1. มีสี่พารามิเตอร์สำหรับการตั้งค่าหน่วยความจำ JVM:
-xmx Java HEAP ค่าสูงสุดค่าเริ่มต้นคือ 1/4 ของหน่วยความจำกายภาพ ค่าการตั้งค่าที่ดีที่สุดควรขึ้นอยู่กับขนาดหน่วยความจำทางกายภาพและค่าใช้จ่ายหน่วยความจำอื่น ๆ ในคอมพิวเตอร์
-xms Java HEAP ค่าเริ่มต้น เป็นการดีที่สุดสำหรับเซิร์ฟเวอร์ JVM ในการตั้งค่า -xms และ -xmx เป็นค่าเดียวกัน JVM ของเครื่องพัฒนาและทดสอบสามารถรักษาค่าเริ่มต้นได้
-xmn Java HEAP ขนาดเล็กในพื้นที่ที่ดีที่สุดคือการรักษาค่าเริ่มต้นหากคุณไม่คุ้นเคยกับมัน
-xSS ขนาดสแต็กของแต่ละเธรดจะเป็นการดีที่สุดที่จะรักษาค่าเริ่มต้นหากคุณไม่คุ้นเคย
2. วิธีการตั้งค่าการจัดสรรหน่วยความจำ JVM:
(1) เมื่อเริ่มต้นและใช้ JVM ที่พรอมต์คำสั่ง (มีผลเฉพาะสำหรับการทดสอบคลาสที่กำลังทำงานอยู่):
java -xmx128m -xms64m -xmn32m -xss16m ทดสอบ
(2) เมื่อเริ่มต้นและใช้ JVM ในสภาพแวดล้อมการพัฒนาแบบบูรณาการ (เช่น eclipse):
. เปิด eclipse.ini ในไดเรกทอรีรูทของ Eclipse และเนื้อหาเริ่มต้นคือ (การจัดสรรหน่วยความจำ JVM ถูกตั้งค่าที่นี่เพื่อเรียกใช้เครื่องมือพัฒนาปัจจุบัน):
-vmargs หมายความว่าต่อไปนี้เป็นพารามิเตอร์การตั้งค่าเครื่องเสมือน คุณสามารถแก้ไขค่าพารามิเตอร์ในนั้นหรือเพิ่ม -xmn และ -xss นอกจากนี้หน่วยความจำที่ไม่ใช่กองสามารถตั้งค่าใน eclipse.ini เช่น: -xx: permsize = 56m, -xx: maxpermsize = 128m
ค่าพารามิเตอร์ที่ตั้งไว้ที่นี่สามารถแสดงในแถบสถานะของเครื่องมือพัฒนาผ่านการกำหนดค่าต่อไปนี้:
สร้างตัวเลือกไฟล์ในไดเรกทอรีรูท Eclipse เนื้อหาไฟล์คือ: org.eclipse.ui/perf/showHeapStatus=true
แก้ไขไฟล์ eclipse.ini ในไดเรกทอรีรูทของ eclipse และเพิ่มเนื้อหาต่อไปนี้ที่จุดเริ่มต้น:
รีสตาร์ท Eclipse และคุณจะเห็นว่ามีข้อมูล JVM เพิ่มเติมในแถบสถานะด้านล่าง
ข. Open Eclipse-Window-Preferences-java-installed JRE (มีประสิทธิภาพสำหรับโปรแกรม Java ทั้งหมดที่ทำงานในสภาพแวดล้อมการพัฒนาปัจจุบัน)
แก้ไข JRE ที่ใช้ในปัจจุบัน, Enter: -xmx128m -xms64m -xmn32m -xss16m
ค. เปิดแอปพลิเคชั่น Open Eclipse-Run-Java (มีผลเฉพาะสำหรับคลาส Java Set)
เลือกคลาสที่จะตั้งค่าการจัดสรรหน่วยความจำ -อาร์กิวเมนต์ป้อนในอาร์กิวเมนต์ vm: -xmx128m -xms64m -xmn32m -xss16m
หมายเหตุ: หากมีการตั้งค่า B และ C ในเวลาเดียวกันในสภาพแวดล้อมการพัฒนาเดียวกันการตั้งค่า B จะมีผลและการตั้งค่า C ไม่ถูกต้องเช่น:
การตั้งค่าสภาพแวดล้อมการพัฒนาคือ: -xmx256m และการตั้งค่าการทดสอบคลาสคือ: -xmx128m -xms64m การตั้งค่าที่มีผลเมื่อทำการทดสอบคือ:
-Xmx256m -Xms64m
(3) เมื่อเริ่มต้นและใช้ JVM ในสภาพแวดล้อมเซิร์ฟเวอร์ (เช่น TOMCAT) (ดังนั้นโปรแกรม Java จะมีผลในสภาพแวดล้อมเซิร์ฟเวอร์ปัจจุบัน):
. ตั้งค่าตัวแปรสภาพแวดล้อม:
ชื่อตัวแปร: catalina_opts
ค่าตัวแปร: -xmx128m -xms64m -xmn32m -xss16m
ข. เปิดโฟลเดอร์ถังขยะในไดเรกทอรีรากของ tomcat, แก้ไข catalina.bat และแทนที่�talina_opts% (ทั้งหมดสี่แห่ง) ด้วย: -xmx128m -xms64m -xmn32m -xss16m
2. ตรวจสอบข้อมูลหน่วยความจำ JVM
runtime.getRuntime (). MaxMemory (); // หน่วยความจำที่มีอยู่สูงสุดซึ่งสอดคล้องกับ -xmx
runtime.getRuntime (). freememory (); // หน่วยความจำฟรี JVM ปัจจุบัน
runtime.getRuntime (). TotalMemory (); // หน่วยความจำทั้งหมดที่ถูกครอบครองโดย JVM ปัจจุบันเทียบเท่ากับผลรวมของหน่วยความจำที่ใช้โดย JVM ปัจจุบันและ Freememory ()
เกี่ยวกับ maxmemory (), freememory () และ totalMemory ():
MaxMemory () เป็นหน่วยความจำสูงสุดของ JVM ซึ่งสามารถตั้งค่าผ่าน -xmx ค่าเริ่มต้นคือ 1/4 ของหน่วยความจำทางกายภาพและค่าที่กำหนดไม่สามารถสูงกว่าหน่วยความจำทางกายภาพของคอมพิวเตอร์
TotalMemory () เป็นหน่วยความจำรวมที่ถูกครอบครองโดย JVM ปัจจุบันและค่าของมันเทียบเท่ากับผลรวมของหน่วยความจำที่ใช้โดย JVM ปัจจุบันและ Freememory () ซึ่งจะเพิ่มขึ้นเมื่อ JVM ใช้หน่วยความจำเพิ่มขึ้น
Freememory () เป็นหน่วยความจำฟรี JVM ปัจจุบัน เนื่องจาก JVM ครอบครองหน่วยความจำทางกายภาพเท่านั้นเมื่อต้องการหน่วยความจำค่าของ freememory () โดยทั่วไปมีขนาดเล็กมาก หน่วยความจำที่มีอยู่จริงของ JVM ไม่เท่ากับ freememory () แต่ควรเท่ากับ maxmemory ()-TotalMemory ()+freememory () มันตั้งค่าการจัดสรรหน่วยความจำ JVM
ดูเอกสารอย่างเป็นทางการ:
http://docs.sun.com/source/819-0084/pt_tuningjava.html
พารามิเตอร์การเริ่มต้น Java แบ่งออกเป็นสามประเภท
หนึ่งคือพารามิเตอร์มาตรฐาน (-) การใช้งาน JVM ทั้งหมดจะต้องใช้ฟังก์ชันของพารามิเตอร์เหล่านี้และเข้ากันได้ย้อนหลัง
ที่สองคือพารามิเตอร์ที่ไม่ได้มาตรฐาน (-x) JVM เริ่มต้นใช้ฟังก์ชั่นของพารามิเตอร์เหล่านี้ แต่ไม่รับประกันว่าการใช้งาน JVM ทั้งหมดจะเป็นที่พอใจและไม่รับประกันว่าจะเข้ากันได้ย้อนหลัง
ที่สามคือพารามิเตอร์ที่ไม่คงที่ (-xx) การใช้งาน JVM แต่ละครั้งของพารามิเตอร์ดังกล่าวจะแตกต่างกันและอาจถูกยกเลิกได้ตลอดเวลาในอนาคต มันจะต้องใช้ด้วยความระมัดระวัง;
มีประโยชน์มากขึ้นระหว่างพารามิเตอร์มาตรฐาน:
verbose
-Verbose: ชั้นเรียน
เอาต์พุตข้อมูลที่เกี่ยวข้องของ JVM โหลดคลาสและสามารถใช้สำหรับการวินิจฉัยเมื่อ JVM รายงานว่าไม่พบชั้นเรียนหรือความขัดแย้งในชั้นเรียน
-Verbose: GC
ส่งออกสถานการณ์ที่เกี่ยวข้องของแต่ละ GC
-Verbose: Jni
เอาต์พุตสถานการณ์ที่เกี่ยวข้องของการเรียกวิธีการดั้งเดิมซึ่งโดยทั่วไปจะใช้ในการวินิจฉัยข้อมูลข้อผิดพลาดการโทร JNI
พารามิเตอร์ที่ไม่ได้มาตรฐานเรียกอีกอย่างว่าพารามิเตอร์ Extended
ที่ใช้กันมากที่สุดคือ
-XMS512M ตั้งค่า JVM เพื่อให้หน่วยความจำเป็น 512m ค่านี้สามารถตั้งค่าเช่นเดียวกับ -xmx เพื่อหลีกเลี่ยงการจัดสรรหน่วยความจำ JVM ใหม่ทุกครั้งที่คอลเลกชันขยะเสร็จสมบูรณ์
-XMX512M ตั้งค่าหน่วยความจำสูงสุดที่มีอยู่ของ JVM เป็น 512M
-XMN200M: ตั้งขนาดของคนรุ่นใหม่เป็น 200 ม. ขนาดฮีปทั้งหมด = ขนาดรุ่นเล็ก + ขนาดรุ่นเก่า + ขนาดการสร้างแบบถาวร โดยทั่วไปแล้วรุ่นถาวรมีขนาด 64 เมตรดังนั้นหลังจากเพิ่มคนรุ่นใหม่ขนาดของรุ่นเก่าจะลดลง ค่านี้มีผลกระทบอย่างมากต่อประสิทธิภาพของระบบและ Sun อย่างเป็นทางการแนะนำให้กำหนดค่าเป็น 3/8 ของกองทั้งหมด
-xSS128K:
ตั้งค่าขนาดสแต็กสำหรับแต่ละเธรด หลังจาก JDK5.0 ขนาดสแต็กของแต่ละเธรดคือ 1m และในอดีตขนาดสแต็กของแต่ละเธรดคือ 256k เธรดแอปพลิเคชันเพิ่มเติมต้องการขนาดหน่วยความจำในการปรับ ในหน่วยความจำทางกายภาพเดียวกันการลดค่านี้สามารถสร้างเธรดได้มากขึ้น อย่างไรก็ตามระบบปฏิบัติการยังคงมีข้อ จำกัด เกี่ยวกับจำนวนเธรดในกระบวนการและไม่สามารถสร้างได้อย่างไม่สิ้นสุดโดยมีค่าประสบการณ์ตั้งแต่ประมาณ 3,000 ถึง 5,000
-xloggc: ไฟล์
คล้ายกับฟังก์ชั่น -Verbose: GC มันจะบันทึกสถานการณ์ที่เกี่ยวข้องของแต่ละเหตุการณ์ GC ลงในไฟล์เท่านั้น ตำแหน่งของไฟล์เป็นพื้นที่ที่ดีที่สุดเพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นของเครือข่าย
หากคำสั่ง verbose ปรากฏบนบรรทัดคำสั่งในเวลาเดียวกัน -xloggc จะเหนือกว่า
-xprof
ติดตามโปรแกรมที่กำลังรันและส่งออกข้อมูลการติดตามที่เอาต์พุตมาตรฐาน เหมาะสำหรับการดีบักสภาพแวดล้อมการพัฒนา
รายการพารามิเตอร์ที่มี -xx เป็นคำนำหน้าอาจไม่ได้รับการร้องขอใน JVM และไม่แนะนำให้ Sun และอาจถูกยกเลิกโดยไม่มีการแจ้งเตือนในอนาคต อย่างไรก็ตามพารามิเตอร์เหล่านี้จำนวนมากมีประโยชน์มากสำหรับเราเช่น -xx: Permsize, -xx: Maxpermsize ฯลฯ ที่เรามักจะเห็น;
ก่อนอื่นมาแนะนำพารามิเตอร์พฤติกรรม:
| พารามิเตอร์และค่าเริ่มต้นของพวกเขา | อธิบาย |
| -xx: -disable Explicitgc | ห้ามใช้ system.gc (); แต่ GC ของ JVM ยังคงใช้ได้ |
| -xx:+maxfdlimit | เพิ่มขีด จำกัด สูงสุดเกี่ยวกับจำนวนตัวอธิบายไฟล์ |
| -xx:+scavengefefullgc | GC รุ่นต่อไปมีความสำคัญกว่าการดำเนินการ GC เต็มรูปแบบ |
| -xx:+usegcoverheadLimit | จำกัด สัดส่วนของเวลาที่ใช้กับ GC โดย JVM ก่อนที่จะโยน oom |
| -xx: -useconcmarksweepgc | GC สำหรับคนรุ่นเก่าโดยใช้อัลกอริทึมการแลกเปลี่ยนเครื่องหมายพร้อมกัน |
| -xx: -usperallelgc | เปิดใช้งาน GC แบบขนาน |
| -xx: -usperallelloldgc | เปิดใช้งาน Parallelism สำหรับ GC เต็มรูปแบบและรายการนี้จะเปิดใช้งานโดยอัตโนมัติเมื่อเปิดใช้งาน -xx: -usPerallelGc |
| -xx: -useserialgc | เปิดใช้งาน Serial GC |
| -xx:+usethreadpriorities | เปิดใช้งานลำดับความสำคัญของเธรดท้องถิ่น |
พารามิเตอร์สามตัวของตัวหนาในตารางด้านบนแสดงถึงการดำเนินการ GC ใน JVM
มีสามวิธีในการเข้าแถวคืออนุกรมขนานและพร้อมกัน
SerialGC เป็นวิธี GC เริ่มต้นของ JVM โดยทั่วไปเหมาะสำหรับการใช้งานขนาดเล็กและโปรเซสเซอร์เดี่ยว อัลกอริทึมนั้นค่อนข้างง่ายและประสิทธิภาพของ GC นั้นสูง แต่อาจทำให้แอปพลิเคชันหยุดชั่วคราว
ParallelGC หมายถึงรันไทม์ GC ซึ่งไม่มีผลกระทบต่อการทำงานของแอปพลิเคชัน เธรดของ GC และแอปจะดำเนินการพร้อมกันเพื่อให้การทำงานของแอพไม่ได้รับผลกระทบในระดับสูงสุด
พร้อมกัน (concmarksweepGC) หมายถึงหลายเธรดที่ดำเนินการ GC พร้อมกัน โดยทั่วไปเหมาะสำหรับระบบหลายโปรเซสเซอร์ มันสามารถปรับปรุงประสิทธิภาพของ GC แต่อัลกอริทึมนั้นซับซ้อนและระบบใช้มาก
รายการพารามิเตอร์การปรับแต่งประสิทธิภาพ:
| พารามิเตอร์และค่าเริ่มต้นของพวกเขา | อธิบาย |
| -xx: LargePagesizeIzeInbytes = 4m | ตั้งขนาดหน้าขนาดใหญ่สำหรับ java heap |
| -xx: MaxHeapFreerAtio = 70 | สัดส่วนที่ไม่ได้ใช้งานมากที่สุดในกอง Java หลังจาก GC |
| -xx: maxNewSize = size | ค่าหน่วยความจำสูงสุดที่วัตถุที่สร้างขึ้นใหม่สามารถครอบครองได้ |
| -xx: maxpermsize = 64m | ค่าหน่วยความจำสูงสุดที่วัตถุรุ่นเก่าสามารถครอบครองได้ |
| -xx: minheapfreeratio = 40 | สัดส่วนขั้นต่ำของจำนวนที่ไม่ได้ใช้งานในกอง Java หลังจาก GC |
| -xx: newRatio = 2 | อัตราส่วนความจุหน่วยความจำของคนรุ่นใหม่ต่อความจุหน่วยความจำของรุ่นเก่า |
| -xx: newsize = 2.125m | ค่าเริ่มต้นของหน่วยความจำจะอยู่เมื่อวัตถุรุ่นใหม่ถูกสร้างขึ้น |
| -xx: ReserveDCodecachesize = 32m | รักษาความจุหน่วยความจำที่ถูกครอบครองโดยรหัส |
| -xx: ThreadStackSize = 512 | ตั้งค่าสแต็กเกลียว หากเป็น 0 ให้ใช้ค่าเริ่มต้นของระบบ |
| -xx:+uselargePages | ใช้หน่วยความจำหน้าขนาดใหญ่ |
ในการปรับแต่งประสิทธิภาพประจำวันของเราโดยทั่วไปเราจะใช้คุณลักษณะเหล่านี้ของตัวหนาข้างต้น
รายการพารามิเตอร์การดีบัก:
| พารามิเตอร์และค่าเริ่มต้นของพวกเขา | อธิบาย |
| -xx: -citime | การพิมพ์ใช้เวลาในการรวบรวม JIT |
| -xx: errorfile =./hs_err_pid <pid> .log | บันทึกบันทึกข้อผิดพลาดหรือข้อมูลลงในไฟล์ |
| -xx: -ExtendedDtraceprobes | เปิดโพรบ DTRACE เฉพาะ Solaris |
| -xx: heapdumppath =./java_pid <pid> .hprof | ระบุเส้นทางหรือชื่อไฟล์เมื่อส่งออกข้อมูลกอง |
| -xx: -HeapDumponOutofMemoryError | ส่งออกข้อมูลที่เกี่ยวข้องในกองเมื่อพบ oom เป็นครั้งแรก |
| -xx: | เรียกใช้คำสั่งที่กำหนดเองหลังจากเกิดข้อผิดพลาดร้ายแรงปรากฏขึ้น |
| -xx: onoutofMemoryError = "<cmd args>; <cmd args>" | ดำเนินการคำสั่งที่กำหนดเองเมื่อพบ oom เป็นครั้งแรก |
| -xx: -printclasshistogram | พิมพ์ข้อมูลคอลัมน์ของอินสแตนซ์คลาสหลังจากพบกับ Ctrl -break เช่นเดียวกับฟังก์ชัน JMAP -Histo |
| -xx: -printconcurrentlocks | พิมพ์ข้อมูลที่เกี่ยวข้องเกี่ยวกับการล็อคพร้อมกันหลังจากพบ Ctrl -break ฟังก์ชั่นเดียวกับ JStack -l |
| -xx: -printCommandLineFlags | พิมพ์เครื่องหมายที่ปรากฏบนบรรทัดคำสั่ง |
| -xx: -printcompilation | พิมพ์ข้อมูลที่เกี่ยวข้องเมื่อรวบรวมวิธีการ |
| -xx: -printgc | พิมพ์ข้อมูลที่เกี่ยวข้องทุกครั้งที่ GC |
| -xx: -printgc รายละเอียด | พิมพ์รายละเอียดทุกครั้งที่ GC |
| -xx: -printgctimestamps | พิมพ์การประทับเวลาของแต่ละ GC |
| -xx: -traceclassloading | ติดตามข้อมูลการโหลดของคลาส |
| -xx: -traceclassLoadingPreorder | ติดตามข้อมูลการโหลดของคลาสทั้งหมดที่อ้างอิงถึง |
| -xx: -traceclassresolution | ติดตามสระว่ายน้ำคงที่ |
| -xx: -traceclassunloading | การติดตามคลาสถอนการติดตั้งข้อมูล |
| -xx: -traceLoaderConstraints | การติดตามข้อมูลเกี่ยวกับข้อ จำกัด ของตัวโหลดคลาส |
สรุป
ข้างต้นเป็นวิธีการดำเนินงานของการตั้งค่าพารามิเตอร์การเรียกใช้ JVM ของ Ideallij Idea แนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!