เหตุใดเซิร์ฟเวอร์ของฉันจึงเริ่มต้นช้าลงอย่างมากใน JUnit จากนั้นเมื่อรันแบบสแตนด์อโลน

ฉันมีเซิร์ฟเวอร์ที่ต้องการทำการทดสอบการทำงานแบบอัตโนมัติ จำเป็นต้องเริ่มต้นออบเจ็กต์ทั้งหมดสองสามพันออบเจ็กต์เพื่อสร้างออบเจ็กต์ในรูปแบบหน่วยความจำ โดยดึงข้อมูลจากไฟล์ปรับแต่ง แต่ก็ยังเป็นเรื่องเล็กน้อยสำหรับคอมพิวเตอร์ และเป็นการบูทเครื่องแทบจะทันทีเมื่อเรียกใช้จาก eclipse

เมื่อฉันรันโปรแกรมเดียวกันโดยเป็นส่วนหนึ่งของการทดสอบ Junit ขั้นตอนการเริ่มต้นจะใช้เวลาประมาณ 15 วินาที แทนที่จะเป็นความเร็วทันทีของแอปแบบสแตนด์อโลน ไม่นานนัก แต่ถ้าฉันวางแผนที่จะทำการทดสอบหลายสิบครั้ง มันก็จะรวมกัน

ตาม JVisualVM ในครั้งนี้มีการแพร่กระจายออกไปมากกว่าครึ่งโหล ไม่มีวิธีใดที่ใช้เวลานานกว่า 14% ของเวลา CPU (นี่คือหลังจากที่ฉันปรับวิธีการที่ใช้ CPU 50% ให้เหมาะสม) วิธีการทั้งหมดที่ทำงานอยู่เป็นวิธีการที่ฉันคาดว่าจะเห็นการทำงานและดูเหมือนว่าจะใช้เวลา CPU ทั้งหมดเป็นเปอร์เซ็นต์ที่สมเหตุสมผล ฉันไม่สามารถเปรียบเทียบกับเซิร์ฟเวอร์ที่ใช้งานจริงได้เนื่องจากเซิร์ฟเวอร์ที่ใช้งานจริงเริ่มต้นเร็วมาก ฉันไม่สามารถเริ่มและหยุด JVisualVM ได้เร็วพอที่จะสร้างโปรไฟล์ได้ ดูเหมือนว่าเมธอด init ของอ็อบเจ็กต์ทั้งหมดของฉันอาจใช้เวลานานกว่านั้น เช่น อ็อบเจ็กต์หนึ่งใช้ cpu 3% สำหรับ init แต่มีเวลาในตัวเอง 000 ms และไม่มีการโทรอื่น ๆ แต่ฉันไม่รู้ว่านั่นเป็นผลลัพธ์ทั่วไปที่ใช้ JVisualVM หรือไม่

แม้ว่าจะไม่สำคัญว่าฉันกำลังทำสิ่งหนึ่งที่แตกต่างออกไปใน Junit ของฉันเทียบกับการทำงานเป็นแอปแบบสแตนด์อโลน ฉันใช้วัตถุ serverMock (แม้ว่าจะแทบจะไม่ใช่ ATM จำลองก็ตาม) มันขยายวัตถุเซิร์ฟเวอร์ของฉัน ขณะนี้เหตุผลเดียวที่จะขยายเป็นเพราะวิธีการรันของเซิร์ฟเวอร์ (ซึ่งรันอย่างไม่มีกำหนดเพื่อรอข้อความขาเข้า) เป็นวิธีการป้องกันที่ถูกเรียกโดยเมธอด main() เมื่อเซิร์ฟเวอร์ทำงานเป็น jar การเยาะเย้ยของฉันเพิ่มวิธีการที่จะสร้างเธรดเพื่อเรียกใช้วิธีการรันของเซิร์ฟเวอร์เนื่องจากฉันไม่มีวิธีอื่นในการเริ่มวิธีการในการทดสอบหน่วย อย่างไรก็ตาม การชะลอตัวนั้นอยู่ในการเริ่มต้นของเซิร์ฟเวอร์ก่อนที่จะถึงวิธีการเรียกใช้ เลยไม่คิดว่านี่คือสาเหตุของการชะลอตัวใช่ไหม?


person dsollen    schedule 24.09.2013    source แหล่งที่มา
comment
คุณกำลังติดตั้งโค้ดด้วยเหตุผลด้านความครอบคลุมหรืออะไรทำนองนั้น?   -  person Jon Skeet    schedule 24.09.2013
comment
ไม่มียังไม่ได้. ฉันกำลังเขียนชุดทดสอบขั้นพื้นฐานที่สุดในขณะนี้ จนถึงตอนนี้ฉันมีการทดสอบสองครั้งที่ไม่ทำอะไรเลยนอกจากเริ่มต้นเซิร์ฟเวอร์ ping และปิดเซิร์ฟเวอร์ ไม่มีการครอบคลุมโค้ดหรือพฤติกรรมอื่นๆ นอกเหนือจากพฤติกรรม Junit เริ่มต้นพื้นฐาน   -  person dsollen    schedule 24.09.2013
comment
และสิ่งนี้ทำงานภายใต้ดีบักเกอร์หรือไม่? (ฉันไม่คุ้นเคยกับ JVisualVM แต่ถ้าคุณยังไม่ได้ลองใช้การทดสอบภายใต้ JVM ปกติ นั่นควรเป็นพอร์ตการโทรแรกของคุณ)   -  person Jon Skeet    schedule 24.09.2013
comment
คุณใช้ vmargs เดียวกันหรือไม่ คุณเคยพิจารณาใช้ Hudson/Jenkins เพื่อเริ่มการทดสอบโดยอัตโนมัติเมื่อเช็คอินหรือไม่?   -  person Axel    schedule 24.09.2013
comment
ฉันรัน JVisualVm กับเวอร์ชันของโค้ดในดีบักเกอร์ ดังนั้นฉันจึงสามารถกำหนดเป้าหมายเฉพาะส่วนของ init ที่ใช้เวลานานผิดปกติเท่านั้น อย่างไรก็ตาม ฉันได้ดำเนินการทดสอบภายนอกดีบักเกอร์และเป็นส่วนหนึ่งของ MVN build แล้ว และพบปัญหาเดียวกันในทั้งสองแห่ง ฉันไม่ได้แตะ VMArgs ดังนั้นจึงควรเป็นค่าเริ่มต้นเดียวกันในทั้งสองกรณี   -  person dsollen    schedule 24.09.2013
comment
สภาพแวดล้อมรันไทม์ (เช่น ไดเร็กทอรีการทำงาน, vm args, Caspian, คุณสมบัติของระบบ) เหมือนกันหรือไม่ การเริ่มต้นเซิร์ฟเวอร์ (เช่น เส้นทางผ่านแอปพลิเคชัน) เหมือนกันเมื่อทำงานในทั้งสองสภาพแวดล้อมหรือไม่ ไฟล์ปรับแต่งเดียวกันเหรอ? เข้าสู่ระบบเดียวกัน?   -  person Kkkev    schedule 25.09.2013
comment
คุณช่วยกรุณาพูดอย่างชัดเจนว่าคุณหมายถึงอะไรโดยระยะการเริ่มต้นใช้เวลา 15 วินาที คุณใช้เวลานี้อย่างไร? เหตุการณ์ใดที่คุณได้ทันเวลา? คุณเห็นอะไรบนหน้าจอ? เป็นเวลา 15 วินาทีก่อนที่มุมมอง JUnit runner จะเริ่มแสดงบางสิ่งหรือ 15 วินาทีก่อนที่กระบวนการจะเริ่มต้นหรือ ...   -  person Aaron Digulla    schedule 25.09.2013
comment
ฉันเชื่อว่าการตัดไม้และทุกอย่างก็เหมือนกัน ฉันไม่ได้เปลี่ยนแปลงทุกอย่างอย่างชัดเจนและอย่างน้อยก็ต้องแน่ใจว่าใช้ไฟล์การกำหนดค่าเดียวกัน   -  person dsollen    schedule 26.09.2013
comment
จริงๆ แล้ว ฉันวางจุดพักระหว่างการโทรที่โหลดจากไฟล์กำหนดค่า และสร้างโมเดลหน่วยความจำของเราและการโทรครั้งถัดไปในการกำหนดค่า จากนั้นฉันใช้ JVisualVM เพื่อรับการติดตามการใช้งาน CPU สำหรับการโทรเพียงครั้งเดียวนี้โดยเรียกใช้ตามเวลาที่ใช้ในการเปลี่ยนจากเบรกพอยต์ที่หนึ่งไปยังวินาที การอ่านและการสร้างไฟล์กำหนดค่านี้ใช้เวลาประมาณ 95% ของเวลาบูตเครื่องทั้งหมด โดยพิจารณาจากการตอบสนองของระบบโดยทั่วไป ดูเหมือนว่าจะเป็นการสร้างโมเดลที่กินเวลา CPU ไม่ใช่การอ่านไฟล์   -  person dsollen    schedule 26.09.2013
comment
คุณกำลังรัน Eclipse เมื่อคุณรันเซิร์ฟเวอร์แบบสแตนด์อโลนหรือไม่? Eclipse ใช้ RAM ก้อนใหญ่ เป็นไปได้ว่าเซิร์ฟเวอร์ของคุณจะต้องสลับเมื่อใช้งาน Eclipse และเซิร์ฟเวอร์ของคุณ ดูเหมือนว่าเป็นไปได้ว่า RAM ที่จัดสรรจะแตกต่างออกไป คุณสามารถเพิ่มคำสั่งแก้ไขข้อบกพร่องหลังจากการกำหนดค่าเริ่มต้นเพื่อพิมพ์จำนวน GC ทั้งหมดที่ใช้งานและ % ของเวลาที่ใช้ไปกับ GC ได้หรือไม่ คำถามนี้จะอธิบายวิธีการ   -  person Pace    schedule 26.09.2013
comment
ฉันใช้ eclipse เพื่อรันทั้งสองเวอร์ชัน เพียงหนึ่งเวอร์ชันที่ฉันทำ Junit ฉันทำเซิร์ฟเวอร์เพียงอย่างเดียว ฉันจะลองข้อเสนอแนะอื่น ๆ   -  person dsollen    schedule 26.09.2013