ตัวเลือก JVM -Xss - มันทำอะไรกันแน่?


229

มันบอกไว้ที่นี่ว่า -Xss ใช้เพื่อ "ตั้งค่าขนาดสแต็กเธรด" หมายความว่าอย่างไร ใครช่วยให้ฉันเข้าใจสิ่งนี้ได้บ้าง


ตัวอย่างบางส่วนที่นี่ (ไม่ใช่ของฉัน ... ): herongyang.com/JVM/…
Christophe Roussy

คำตอบ:


269

กระทู้ในโปรแกรม Java แต่ละคนมีของตัวเองสแต็ค สแต็กใช้เพื่อเก็บที่อยู่ผู้ส่งคืนฟังก์ชัน / เมธอดการเรียกใช้อาร์กิวเมนต์ ฯลฯ ดังนั้นหากเธรดมีแนวโน้มที่จะประมวลผลโครงสร้างขนาดใหญ่ผ่านอัลกอริทึมแบบเรียกซ้ำมันอาจต้องใช้สแต็กขนาดใหญ่สำหรับที่อยู่ผู้ส่งเหล่านั้นทั้งหมด ด้วย Sun JVM คุณสามารถกำหนดขนาดนั้นผ่านพารามิเตอร์นั้น


11
ดังนั้นจึงใช้ตัวเลือก -Xss เพื่อ จำกัด จำนวนหน่วยความจำที่สแต็กใช้ (โดยการจัดเก็บที่อยู่ผู้ส่งตัวแปร ฯลฯ ) และที่จำกัดทางอ้อมว่าสแต็คจะได้ลึกเพียงใด ฉันถูกไหม?
instantsetsuna

5
@instantsetsuna: ฉันคิดว่าการใช้งานทั่วไปมากขึ้นน่าจะเป็นการเพิ่มขีด จำกัด เริ่มต้น (มีขีด จำกัด อยู่เสมอ) แต่ใช่คุณควบคุมขนาดของสแต็กซึ่งควบคุมว่าสแต็คจะลึกได้อย่างไร
TJ Crowder

คุณจะเทียบเท่ากับการตั้งค่า XSS นี้ใน java compiler (aka javac) ได้อย่างไร มันเป็นปัญหาสำหรับผู้ที่ใช้ห้องสมุดที่ใช้สกาล่าที่ทำให้เกิดการเรียกซ้ำหางขนาดใหญ่เกิดขึ้นในการรวบรวมชั้นเรียน - Andrew Norman 9 วินาทีที่ผ่านมา
Andrew Norman

@AndrewNorman: คุณไม่ได้รวบรวมตัวเลือกรันไทม์ของ Java ในไฟล์คลาสนั่นเป็นสิ่งที่เฉพาะเจาะจงมากขึ้นสำหรับสภาพแวดล้อม หากคุณต้องการทำในรหัสคุณสามารถเขียนคลาสหลักเล็ก ๆ ซึ่งมีหน้าที่เพียงอย่างเดียวคือเปิดตัวแอปพลิเคชันจริงด้วยตัวเลือกที่คุณต้องการ
TJ Crowder

@AndrewNorman คุณสามารถให้ธงการกำหนดค่า JVM คอมไพเลอร์ควรทำงานด้วยการใช้-Jflagไวยากรณ์ (เช่น. -J-Xss)
francoisr

166

มันตั้งค่าขนาดสแต็กบน JVM

คุณควรจะแตะมันในทั้งสองสถานการณ์นี้:

  • StackOverflowError (ขนาดสแต็กมากกว่าข้อ จำกัด ) เพิ่มค่า
  • OutOfMemoryError: ไม่สามารถสร้างเธรดพื้นเมืองใหม่ (มีเธรดมากเกินไปแต่ละเธรดมีสแต็กขนาดใหญ่) ลดลง

โดยปกติแล้วจะมาเมื่อ Xss ของคุณถูกตั้งค่ามากเกินไป - จากนั้นคุณต้องทำการปรับสมดุล (ทดสอบ!)


3
ไม่จำเป็นทุกครั้งจริง ทั้ง SOE และ OOME อาจเกิดขึ้นเนื่องจากเหตุผลต่าง ๆ ที่ควรได้รับการแก้ไขแตกต่างกัน
noego

4
จริง แต่ฉันไม่ได้บอกว่า -Xss เป็นสาเหตุเดียวของ SOE และ OOME แต่เป็นวิธีอื่น ๆ - หากตั้งอย่างไม่ถูกต้องอาจทำให้เกิดหนึ่งในสอง
Adam Adamaszek

5

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


4

หากฉันไม่เข้าใจผิดนี่เป็นสิ่งที่บอกกับ JVM ว่าจะรับสายที่ต่อเนื่องได้เท่าไหร่ก่อนที่จะออก StackOverflowError ไม่ใช่สิ่งที่คุณต้องการเปลี่ยนโดยทั่วไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.