Câu trả lời ngắn gọn: thường, có, bạn sẽ nhận được một ứng dụng cho mỗi JVM. Câu trả lời dài: JVM có thể được sử dụng theo cách đó và đó có thể là lựa chọn tốt nhất, nhưng không nhất thiết phải như vậy.
Tất cả phụ thuộc vào những gì bạn coi là một 'ứng dụng'. IDE là một ví dụ điển hình về một ứng dụng được hiển thị cho người dùng cuối của nó (tức là chúng tôi) dưới dạng một thực thể duy nhất nhưng thực sự bao gồm nhiều ứng dụng cơ bản (trình biên dịch, trình chạy thử nghiệm, công cụ phân tích tĩnh, người đóng gói, trình quản lý gói, dự án / công cụ quản lý phụ thuộc, v.v.). Trong trường hợp đó, IDE sử dụng nhiều thủ thuật khác nhau để đảm bảo rằng người dùng có trải nghiệm tích hợp trong khi vẫn được bảo vệ (ở một mức độ nào đó) khỏi sự mơ hồ của từng công cụ cơ bản. Một thủ thuật như vậy là thực hiện một số việc trong một JVM riêng biệt, giao tiếp qua các tệp văn bản hoặc thông qua các phương tiện gỡ lỗi cấp ứng dụng.
Máy chủ ứng dụng (Wildfly, Glassfish, Websphere, Weblogic, v.v.) là các ứng dụng có chức năng đặc biệt là đóng vai trò là vùng chứa cho các ứng dụng khác chạy trong đó. Trong trường hợp đó, từ một góc độ, có một JVM cho mỗi ứng dụng (tức là một JVM được sử dụng để chạy toàn bộ máy chủ ứng dụng) nhưng thực tế có nhiều ứng dụng nằm trong JVM đó theo quyền riêng của chúng, mỗi ứng dụng được tách biệt với nhau một cách hợp lý trong trình tải lớp của riêng chúng (giảm khả năng xảy ra nhiễu xuyên âm trong quá trình ngẫu nhiên).
Vì vậy, tất cả thực sự phụ thuộc vào những gì bạn coi là một application
. Nếu bạn hoàn toàn đang nói về "thứ chạy khi 'main ()' được gọi", thì bạn đang xem xét một ứng dụng cho mỗi JVM - khi HĐH khởi động JVM, JVM chạy một public static void main()
phương thức của một lớp .
Nhưng một khi các ứng dụng của bạn bắt đầu phức tạp hơn thì ranh giới của bạn trở nên mờ nhạt hơn. IDE chẳng hạn như Intellij hoặc Eclipse sẽ sử dụng lại nhiều thứ giống như 'javac', trong cùng một JVM hoặc một JVM khác, cũng như thực hiện các công việc khác nhau (chẳng hạn như sơn lại màn hình). Và người dùng ứng dụng web trên máy chủ ứng dụng (JVM dùng chung) có thể thực sự đang sử dụng cùng một ứng dụng 'cốt lõi' như có thể được sử dụng cục bộ thông qua dòng lệnh.