คำตอบสั้น ๆ : บ่อยครั้งใช่คุณจะได้รับหนึ่งแอปพลิเคชันต่อ JVM คำตอบแบบยาว: JVM สามารถใช้ในลักษณะนั้นได้และนั่นอาจเป็นตัวเลือกที่ดีที่สุด แต่ไม่จำเป็นต้องเป็นเช่นนั้น
ทุกอย่างขึ้นอยู่กับสิ่งที่คุณคิดว่าเป็น 'แอปพลิเคชัน' IDE เป็นตัวอย่างที่ดีของแอปพลิเคชันที่นำเสนอต่อผู้ใช้ปลายทาง (เช่นเรา) เป็นเอนทิตีเดียว แต่จริงๆแล้วประกอบด้วยแอปพลิเคชันพื้นฐานหลายตัว (คอมไพเลอร์ตัวทดสอบตัวทดสอบเครื่องมือวิเคราะห์แบบคงที่ผู้บรรจุหีบห่อผู้จัดการแพ็คเกจโครงการ / เครื่องมือจัดการการพึ่งพา ฯลฯ ) ในกรณีนี้มีกลเม็ดมากมายที่ IDE ใช้เพื่อให้แน่ใจว่าผู้ใช้จะได้รับประสบการณ์แบบบูรณาการในขณะเดียวกันก็ได้รับการป้องกัน (ในระดับหนึ่ง) จากความหลากหลายของเครื่องมือพื้นฐาน เคล็ดลับอย่างหนึ่งก็คือการทำบางสิ่งใน JVM ที่แยกจากกันโดยสื่อสารผ่านไฟล์ข้อความหรือผ่านอุปกรณ์ดีบักระดับแอปพลิเคชัน
แอ็พพลิเคชันเซิร์ฟเวอร์ (Wildfly, Glassfish, Websphere, Weblogic ฯลฯ ) เป็นแอปพลิเคชันที่ raison d'etre ทำหน้าที่เป็นคอนเทนเนอร์สำหรับแอปพลิเคชันอื่น ๆ ในการทำงานในกรณีนี้จากมุมมองเดียวจะมี JVM เดียวต่อแอปพลิเคชัน (เช่นหนึ่ง JVM ใช้เพื่อเรียกใช้แอ็พพลิเคชันเซิร์ฟเวอร์ทั้งหมด) แต่จริงๆแล้วมีหลายแอปพลิเคชันที่อยู่ภายใน JVM นั้นในสิทธิของตัวเองแต่ละตัวแยกออกจากกันอย่างมีเหตุผลใน classloader ของตัวเอง (ลดความเป็นไปได้ที่จะเกิด crosstalk ในกระบวนการโดยไม่ได้ตั้งใจ)
ดังนั้นทุกอย่างขึ้นอยู่กับสิ่งที่คุณคิดว่าapplication
จะเป็นจริงๆ หากคุณกำลังพูดถึง "สิ่งที่ทำงานเมื่อมีการเรียก 'main ()' เท่านั้นแสดงว่าคุณกำลังดูแอปพลิเคชันเดียวต่อ JVM - เมื่อระบบปฏิบัติการเริ่มต้น JVM JVM จะเรียกใช้public static void main()
เมธอดของคลาสเดียว
แต่เมื่อแอปพลิเคชันของคุณเริ่มซับซ้อนขึ้นขอบเขตของคุณก็จะเบลอมากขึ้น IDE เช่น Intellij หรือ Eclipse จะนำสิ่งเดียวกันกับ 'javac' มาใช้ซ้ำไม่ว่าจะเป็น JVM เดียวกันหรือต่างกันรวมถึงการทำงานที่แตกต่างกัน (เช่นการทาสีหน้าจอใหม่) และผู้ใช้เว็บแอปพลิเคชันบนแอปพลิเคชันเซิร์ฟเวอร์ (JVM ที่ใช้ร่วมกัน) อาจใช้แอปพลิเคชัน 'หลัก' เดียวกันกับที่สามารถใช้ในเครื่องผ่านทางบรรทัดคำสั่ง