Tomcat Memory Overflow การตั้งค่า java_opts
คำตอบ 1
ตั้งค่าหน่วยความจำเริ่มต้นสำหรับการเริ่มต้น Tomcat
พื้นที่เริ่มต้น (เช่น -xms) คือ 1/64 ของหน่วยความจำทางกายภาพและพื้นที่สูงสุด (-xmx) คือ 1/4 ของหน่วยความจำทางกายภาพ คุณสามารถใช้ -xmn -xms -xmx และตัวเลือกอื่น ๆ ที่จัดทำโดย JVM
ตั้งค่า
3. ตัวอย่างต่อไปนี้ให้การอ้างอิงสำหรับการตั้งค่าพารามิเตอร์ของ Java JVM ในสภาพแวดล้อมหน่วยความจำ 1G:
java_opts = " -เซิร์ฟเวอร์ -xms800m -xmx800m
-xx: permsize = 64m -xx: maxNewSize = 256m -xx: maxpermsize = 128m -djava.awt.headless = true "
java_opts = " -เซิร์ฟเวอร์ -xms768m -xmx768m -xx: permsize = 128m -xx: maxpermsize = 256m -xx:
newsize = 192m -xx: maxNewSize = 384M "
catalina_opts = " -เซิร์ฟเวอร์ -xms768m -xmx768m -xx: permsize = 128m -xx: maxpermsize = 256m
-xx: newsize = 192m -xx: maxNewSize = 384M "
Linux:
catalina.sh ในไดเร็กทอรี/usr/local/apache-tomcat-5.5.23/bin
เพิ่ม: java_opts = ' -xms512m -xmx1024m'
หากคุณต้องการเพิ่ม "M" หมายความว่ามันเป็น MB มิฉะนั้นจะเป็น KB และจะมีหน่วยความจำไม่เพียงพอเมื่อเริ่มต้น Tomcat
-xms: ค่าเริ่มต้น
-xmx: ค่าสูงสุด
-xmn: ค่าต่ำสุด
หน้าต่าง
เข้าร่วมหน้า catalina.bat
ตั้งค่า java_opts = -xms128m -xmx350m
หากคุณเริ่มต้น Tomcat ด้วย startup.bat การตั้งค่า OK จะมีผล หน่วยความจำ 200 ม. จะได้รับการจัดสรรสำเร็จ
อย่างไรก็ตามหากคุณไม่ดำเนินการ startup.bat เพื่อเริ่มต้น Tomcat แต่ใช้บริการระบบ Windows เพื่อเริ่มบริการ Tomcat การตั้งค่าข้างต้นจะไม่มีผล
กล่าวคือตั้งค่า java_opts = -xms128m -xmx350m ไม่ทำงาน หากคุณจัดสรรหน่วยความจำ 200 เมตรด้านบนคุณจะเป็น oom ...
บริการ Windows ดำเนินการ bin/tomcat.exe มันอ่านค่าในรีจิสทรีไม่ใช่การตั้งค่า catalina.bat
สารละลาย:
แก้ไข Registry HKEY_LOCAL_MACHINE/ซอฟต์แวร์/ซอฟต์แวร์ Apache Software Foundation/Tomcat Service Manager/TomCat5/พารามิเตอร์/Javaoptions
ค่าดั้งเดิมคือ
-dCatalina.home = "C:/Apachegroup/Tomcat 5.0"
-djava.endorsed.dirs = "c:/apachegroup/tomcat 5.0/สามัญ/รับรอง"
-xrs
เพิ่ม -xms300m -xmx350m
รีสตาร์ทบริการ Tomcat และการตั้งค่าจะมีผลบังคับใช้
คำตอบ 2
โซลูชันการแก้ปัญหาของหน่วยความจำ jvm ของ Tomcat
คำสำคัญ: โซลูชันการแก้ปัญหาของหน่วยความจำ jvm ของ Tomcat
เมื่อเร็ว ๆ นี้ฉันคุ้นเคยกับโครงการที่ได้รับการพัฒนามาหลายปีแล้ว ฉันต้องพอร์ตฐานข้อมูลจาก MySQL ไปยัง Oracle ก่อนอื่นให้ชี้การเชื่อมต่อ JDBC ไปยัง MySQL จัดทำมันลงใน Tomcat แล้วเรียกใช้ ไม่มีปัญหา อย่างไรก็ตามเมื่อชี้การเชื่อมต่อ JDBC ไปยัง Oracle Tomcat จะโยนข้อผิดพลาด java.lang.outofmemoryError อย่างต่อเนื่อง Google อินเทอร์เน็ตเข้าใจกลไกการทำงานของ Tomcat และแก้ปัญหา แบ่งปันสำหรับการอ้างอิง
1. ครั้งแรกคือ: java.lang.outofMemoryError: พื้นที่ java heap
อธิบาย:
การตั้งค่าขนาดกอง
การตั้งค่าของกอง JVM อ้างถึงการตั้งค่าของพื้นที่หน่วยความจำที่ JVM สามารถจัดเตรียมได้ในระหว่างการทำงานของโปรแกรม Java เมื่อ JVM เริ่มต้นขึ้นมันจะตั้งค่าขนาดฮีปโดยอัตโนมัติ พื้นที่เริ่มต้น (เช่น -xms) คือ 1/64 ของหน่วยความจำทางกายภาพและพื้นที่สูงสุด (-xmx) คือ 1/4 ของหน่วยความจำทางกายภาพ คุณสามารถใช้ -xmn -xms -xmx และตัวเลือกอื่น ๆ ที่จัดทำโดย JVM เพื่อตั้งค่า ขนาดของขนาดฮีปคือผลรวมของคนรุ่นใหม่และผู้ครอบครอง
เคล็ดลับ: ข้อความข้อยกเว้นนี้จะถูกโยนลงหากใช้เวลา 98% ของเวลาสำหรับ GC และขนาดกองที่มีอยู่น้อยกว่า 2%
เคล็ดลับ: ขนาดฮีปสูงสุดไม่ควรเกิน 80% ของหน่วยความจำทางกายภาพที่มีอยู่ โดยทั่วไปตั้งค่าตัวเลือก -xms และ -xmx เป็นเดียวกันในขณะที่ -xmn คือ 1/4 ของค่า -xmx
สารละลาย:
ตั้งขนาดฮีปด้วยตนเอง
แก้ไข tomcat_home/bin/catalina.bat และเพิ่มบรรทัดต่อไปนี้เป็น "echo" โดยใช้ catalina_base: $ catalina_base ":
รหัส Java
ตั้งค่า java_opts =% java_opts% -server -xms800m -xmx800m -xx: maxNewSize = 256m
ตั้งค่า java_opts =% java_opts% -server -xms800m -xmx800m -xx: maxNewSize = 256m
หรือแก้ไข catalina.sh
เพิ่มบรรทัดต่อไปนี้ใน "echo" โดยใช้ catalina_base: $ catalina_base "::
java_opts = "$ java_opts -server -xms800m -xmx800m -xx: maxNewSize = 256m"
2. ประการที่สอง: java.lang.outofMemoryError: Permgen Space
เหตุผล:
ชื่อเต็มของพื้นที่ Permgen เป็นพื้นที่สร้างถาวรซึ่งหมายถึงพื้นที่จัดเก็บถาวรของหน่วยความจำ หน่วยความจำนี้ส่วนใหญ่จะถูกเก็บไว้โดย JVM ในข้อมูลคลาสและเมตา ชั้นเรียนจะถูกวางไว้ในพื้นที่ permgen เมื่อโหลด มันแตกต่างจากพื้นที่ฮีปที่จัดเก็บอินสแตนซ์ (อินสแตนซ์) GC (Garbage Collection) จะไม่ทำความสะอาดพื้นที่ permgen ในระหว่างการรันไทม์ของโปรแกรมหลัก ดังนั้นหากมีคลาสจำนวนมากในแอปพลิเคชันของคุณเป็นไปได้มากที่ข้อผิดพลาดของพื้นที่ Permgen จะเกิดขึ้น ข้อผิดพลาดนี้เป็นเรื่องปกติเมื่อเว็บเซิร์ฟเวอร์ precompiles jsp หากคุณใช้ขวดของบุคคลที่สามจำนวนมากภายใต้เว็บแอปของคุณขนาดเกินขนาดเริ่มต้นของ JVM (4M) ข้อความแสดงข้อผิดพลาดนี้จะถูกสร้างขึ้น
สารละลาย:
1. ตั้งขนาด maxpermsize ด้วยตนเองด้วยตนเอง
แก้ไข tomcat_home/bin/catalina.bat (catalina.sh ภายใต้ Linux) ในรหัส Java
"echo" โดยใช้ catalina_base: $ catalina_base "" เพิ่มบรรทัดต่อไปนี้:
ตั้งค่า java_opts =% java_opts% -server -xx: permsize = 128m -xx: maxpermsize = 512m
"echo" โดยใช้ catalina_base: $ catalina_base "" เพิ่มบรรทัดต่อไปนี้:
ตั้งค่า java_opts =% java_opts% -server -xx: permsize = 128m -xx: maxpermsize = 512m
catalina.sh คือ:
รหัส Java
java_opts = "$ java_opts -server -xx: permsize = 128m -xx: maxpermsize = 512m"
java_opts = "$ java_opts -server -xx: permsize = 128m -xx: maxpermsize = 512m"
ฉันยังเห็นโพสต์อื่นและคิดว่ามันดีมาก ข้อความที่ตัดตอนมามีดังนี้:
การวิเคราะห์ java.lang.outofMemoryError: พื้นที่ permgen
ฉันพบว่าหลายคนมีปัญหากับปัญหา: ฤดูใบไม้ผลิ, ไฮเบอร์เนต, Tomcat, เพราะพวกเขาสร้างชั้นเรียนแบบไดนามิกทำให้กองถาวรใน JVM ล้น จากนั้นมีความคิดเห็นที่แตกต่างกันมากมายเกี่ยวกับการแก้ปัญหา บางคนบอกว่าการอัพเกรดเวอร์ชัน Tomcat เป็นล่าสุดไม่จำเป็นแม้แต่ Tomcat บางคนก็สงสัยว่าปัญหาของฤดูใบไม้ผลิและมันร้อนมากในฟอรัมฤดูใบไม้ผลิเพราะการใช้ CBLIB ในฤดูใบไม้ผลิเมื่อ AOP จะสร้างคลาสมากมายแบบไดนามิก
แต่คำถามคือเหตุผลว่าทำไมปัญหาเดียวกันจึงเกิดขึ้นกับโอเพ่นซอร์สการ์ดทรัมป์เหล่านี้ดังนั้นมันจึงเป็นเหตุผลพื้นฐานมากกว่านี้? Tomcat ตอบสิ่งนี้ด้วยวิธีที่คลุมเครือมากในคำถาม & คำตอบ เรารู้คำถามนี้ แต่คำถามนี้เกิดขึ้นจากคำถามพื้นฐานมากขึ้น
ดังนั้นมีคนตรวจสอบ JVM ขั้นพื้นฐานมากขึ้นและพบกุญแจสำคัญในปัญหา ปรากฎว่า JVM ของ Sun แบ่งหน่วยความจำออกเป็นพื้นที่ต่าง ๆ ซึ่งหนึ่งในนั้นคือพื้นที่ Permenter เพื่อจัดเก็บชั้นเรียนและคำอธิบายชั้นเรียนจำนวนมาก ในขั้นต้นเมื่อซันได้รับการออกแบบเชื่อกันว่าบริเวณนี้ได้รับการแก้ไขเมื่อ JVM เริ่มต้นขึ้น แต่เขาไม่ได้คาดหวังว่าการเปลี่ยนแปลงจะถูกใช้อย่างกว้างขวางในตอนนี้ นอกจากนี้บริเวณนี้มีกลไกการเก็บขยะพิเศษ ปัญหาปัจจุบันคือหลังจากโหลดคลาสแบบไดนามิกไปยังพื้นที่นี้ GC ไม่สามารถรีไซเคิลได้!
สำหรับคำถามสองข้อข้างต้นการจัดการของฉันคือ:
เพิ่มในบรรทัดแรกของ catalina.bat:
รหัส Java
ตั้งค่า java_opts = -xms64m -xmx256m -xx: permsize = 128m -xx: maxNewSize = 256m -xx: maxpermsize = 256m
ตั้งค่า java_opts = -xms64m -xmx256m -xx: permsize = 128m -xx: maxNewSize = 256m -xx: maxpermsize = 256m
เพิ่มในบรรทัดแรกของ catalina.sh:
รหัส Java
java_opts =
-xms64m
-xmx256m
-xx: Permsize = 128m
-xx: maxNewSize = 256M
-xx: maxpermsize = 256m
ทางออกที่สมบูรณ์แบบสำหรับหน่วยความจำ Tomcat ที่ล้นในบทความข้างต้นคือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น