คำถามติดแท็ก stackoverflow

2
StackOverflowError ใน Java หรือไม่?
ฉันเคยคิดว่ามันไม่ได้ แต่เมื่อวานนี้ฉันต้องทำ มันเป็นแอพพลิเคชั่นที่ใช้Akka (ระบบการทำงานของนักแสดงสำหรับ JVM) เพื่อประมวลผลงานอะซิงโครนัส หนึ่งในนักแสดงทำการจัดการไฟล์ PDF บางส่วนและเนื่องจากห้องสมุดมีรถบั๊กมันก็ตายด้วยStackOverflowErrorทุก ๆ คราว ด้านที่สองคือ Akka ได้รับการกำหนดค่าให้ปิดระบบนักแสดงทั้งหมดหากมีข้อผิดพลาดร้ายแรง JVM (เช่น StackOverflowError) ประเด็นที่สามคือระบบนักแสดงนี้ถูกฝังอยู่ภายในเว็บแอพ (สำหรับ WTF-ish, มรดก, เหตุผล) ดังนั้นเมื่อระบบนักแสดงปิดตัวลงแอปพลิเคชันเว็บจะไม่ ผลกระทบสุทธิคือในStackOverflowErrorแอปพลิเคชันการประมวลผลงานของเรากลายเป็นเพียงเว็บแอปที่ว่างเปล่า การแก้ไขอย่างรวดเร็วฉันต้องจับStackOverflowErrorการโยนเพื่อให้กลุ่มเธรดของระบบนักแสดงไม่ฉีกขาด นี่ทำให้ฉันคิดว่าบางทีมันก็โอเคที่จะจับข้อผิดพลาดโดยเฉพาะอย่างยิ่งในบริบทเช่นนี้? เมื่อใดที่มีเธรดพูลกำลังประมวลผลงานตามอำเภอใจ? ซึ่งแตกต่างจากOutOfMemoryErrorฉันไม่สามารถจินตนาการว่าStackOverflowErrorสามารถออกจากโปรแกรมที่อยู่ในสถานะที่ไม่สอดคล้องกัน สแต็กจะถูกล้างหลังจากข้อผิดพลาดดังกล่าวดังนั้นการคำนวณจึงสามารถดำเนินต่อได้ตามปกติ แต่บางทีฉันอาจพลาดสิ่งสำคัญไป นอกจากนี้ขอให้สังเกตว่าฉันทั้งหมดเพื่อแก้ไขข้อผิดพลาดในสถานที่แรก (ตามความเป็นจริงฉันได้แก้ไข SOE ในแอพเดียวกันนี้เมื่อไม่กี่วันที่ผ่านมา) แต่ฉันไม่รู้จริง ๆ ว่าเมื่อใด สถานการณ์แบบนี้อาจเกิดขึ้นได้ เหตุใดจึงเป็นการดีกว่าที่จะเริ่มกระบวนการ JVM ใหม่แทนการจับStackOverflowErrorทำเครื่องหมายว่างานนั้นล้มเหลวและดำเนินธุรกิจของฉันต่อไป มีเหตุผลที่น่าสนใจไหมที่จะไม่ใช้ SOE? ยกเว้น "แนวปฏิบัติที่ดีที่สุด" ซึ่งเป็นคำที่คลุมเครือซึ่งไม่ได้บอกอะไรเลย

1
seq ใช้บ่อยแค่ไหนในรหัสการผลิต Haskell
ฉันมีประสบการณ์ในการเขียนเครื่องมือขนาดเล็กใน Haskell และฉันพบว่ามันใช้งานง่ายมากโดยเฉพาะการเขียนตัวกรอง (โดยใช้interact) ที่ประมวลผลอินพุตมาตรฐานและไพพ์ไปยังเอาต์พุตมาตรฐาน เมื่อเร็ว ๆ นี้ฉันพยายามใช้ตัวกรองดังกล่าวกับไฟล์ที่มีขนาดใหญ่กว่าปกติประมาณ 10 เท่าและฉันพบStack space overflowข้อผิดพลาด หลังจากอ่านบางส่วน (เช่นที่นี่และที่นี่ ) ฉันได้ระบุแนวทางสองข้อเพื่อประหยัดพื้นที่สแต็ก (Haskellers ที่มีประสบการณ์โปรดแก้ไขให้ฉันถ้าฉันเขียนสิ่งที่ไม่ถูกต้อง): หลีกเลี่ยงการเรียกฟังก์ชั่นแบบเรียกซ้ำที่ไม่ใช่แบบเรียกซ้ำ (ใช้ได้กับทุกภาษาที่ใช้งานได้ซึ่งรองรับการปรับให้เหมาะสมแบบหางเรียก) แนะนำseqให้บังคับให้มีการประเมินผลก่อนของนิพจน์ย่อยเพื่อให้นิพจน์ไม่ใหญ่เกินไปก่อนที่จะถูกลดขนาดลง (นี่เป็นลักษณะเฉพาะของ Haskell หรืออย่างน้อยก็สำหรับภาษาที่ใช้การประเมินแบบขี้เกียจ) หลังจากแนะนำการseqโทรห้าหรือหกครั้งในรหัสของฉันเครื่องมือของฉันจะทำงานได้อย่างราบรื่นอีกครั้ง (เช่นเดียวกับข้อมูลขนาดใหญ่) อย่างไรก็ตามฉันพบว่ารหัสต้นฉบับอ่านง่ายขึ้นอีกเล็กน้อย เนื่องจากฉันไม่ใช่โปรแกรมเมอร์ Haskell ที่มีประสบการณ์ฉันต้องการถามว่าการแนะนำseqด้วยวิธีนี้เป็นวิธีปฏิบัติทั่วไปหรือไม่และบ่อยครั้งที่บุคคลทั่วไปจะเห็นseqในรหัสการผลิต Haskell หรือมีเทคนิคใดบ้างที่อนุญาตให้หลีกเลี่ยงการใช้seqบ่อยเกินไปและยังคงใช้พื้นที่สแต็กน้อย?

4
การใช้สแต็คมีมากเกินไปมากเกินไป?
เมื่อเร็ว ๆ นี้เมื่อฉันเขียน C หรือ C ++ ฉันจะประกาศตัวแปรทั้งหมดของฉันในสแต็คเพียงเพราะเป็นตัวเลือกซึ่งแตกต่างจาก Java อย่างไรก็ตามฉันได้ยินมาว่าเป็นความคิดที่ดีที่จะประกาศเรื่องใหญ่ ๆ ในกองซ้อน ทำไมเป็นกรณีนี้ ฉันคิดว่าสแต็กล้นมีส่วนเกี่ยวข้อง แต่ฉันไม่ชัดเจนว่าทำไมจึงเกิดขึ้น สแต็คมีมากน้อยเพียงใด? ฉันไม่ได้พยายามที่จะวางไฟล์ 100MB ในสแต็กเพียงหนึ่งโหลกิโลไบต์อาร์เรย์เพื่อใช้เป็นบัฟเฟอร์สตริงหรืออะไรก็ตาม มีการใช้งานสแต็กมากเกินไปหรือไม่ (ขออภัยหากซ้ำกันการค้นหาสแต็กยังคงให้การอ้างอิงถึงสแต็คโอเวอร์โฟลไม่มีแม้แต่สแต็กแท็กการโทรฉันเพิ่งใช้นามธรรมหนึ่ง)

3
มีการเรียกฟังก์ชันซ้อนกันมากเกินไปจำนวนเท่าใด?
อ้างจากMSDN เกี่ยวกับ StackOverflowException : ข้อยกเว้นที่ถูกส่งออกมาเมื่อการดำเนินการสแต็คล้นเพราะมันมีการเรียกวิธีการซ้อนกันมากเกินไป Too manyที่นี่ค่อนข้างคลุมเครือ ฉันจะรู้ได้อย่างไรว่าเมื่อใดมากเกินไปมากเกินไปจริง ๆ ? การเรียกใช้ฟังก์ชันหลายพันครั้ง? ล้าน? ฉันคิดว่ามันต้องเกี่ยวข้องกับปริมาณของหน่วยความจำในคอมพิวเตอร์ แต่เป็นไปได้ไหมที่จะมีขนาดของลำดับความแม่นยำที่ถูกต้อง? ฉันกังวลเกี่ยวกับเรื่องนี้เพราะฉันกำลังพัฒนาโครงการที่เกี่ยวข้องกับการใช้โครงสร้างแบบเรียกซ้ำและการเรียกใช้ฟังก์ชันแบบเรียกซ้ำ ฉันไม่ต้องการให้แอปพลิเคชันล้มเหลวเมื่อฉันเริ่มใช้งานมากกว่าการทดสอบเล็กน้อย

4
เมื่อไม่มี TCO เมื่อใดต้องกังวลเกี่ยวกับการสแต็คกอง?
ทุกครั้งที่มีการอภิปรายเกี่ยวกับภาษาการเขียนโปรแกรมใหม่ที่กำหนดเป้าหมาย JVM ย่อมมีคนพูดถึงสิ่งต่าง ๆ เช่น: "JVM ไม่รองรับการปรับให้เหมาะสมแบบหางเรียกดังนั้นฉันทำนายสแต็กการระเบิดจำนวนมาก" ชุดรูปแบบนั้นมีการเปลี่ยนแปลงหลายพันรายการ ตอนนี้ฉันรู้ว่าบางภาษาเช่น Clojure มีโครงสร้างการเกิดขึ้นเป็นพิเศษที่คุณสามารถใช้ สิ่งที่ฉันไม่เข้าใจคือ: การขาดการเพิ่มประสิทธิภาพการโทรหางมีความร้ายแรงเพียงใด? ฉันควรกังวลเกี่ยวกับเรื่องนี้เมื่อใด แหล่งที่มาหลักของความสับสนอาจมาจากความจริงที่ว่า Java เป็นหนึ่งในภาษาที่ประสบความสำเร็จมากที่สุดและภาษา JVM บางส่วนดูเหมือนจะทำได้ค่อนข้างดี วิธีการที่เป็นไปได้ถ้าขาดการ TCO เป็นจริงของใด ๆกังวล?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.