Có một JVM cho mỗi ứng dụng Java không?


91

Có phải cùng một JVM được sử dụng bởi tất cả các ứng dụng Java đang chạy hay 'một JVM cho mỗi ứng dụng Java' có áp dụng không? (giả sử các ứng dụng là IntelliJ IDEA, một máy chủ và NetBeans chẳng hạn)

Hơn nữa, có bất kỳ kết nối nào giữa các JVM được chỉ định và các quy trình được sử dụng bởi mỗi ứng dụng Java không?


2
Đâ là một câu hỏi tuyệt vời. :)
jamie

Câu trả lời:


81

Nói chung, mỗi ứng dụng sẽ nhận được cá thể JVM riêng và quy trình cấp hệ điều hành của riêng nó và mỗi cá thể JVM là độc lập với nhau.

Có một số chi tiết triển khai chẳng hạn như Chia sẻ dữ liệu lớp , trong đó nhiều phiên bản JVM có thể chia sẻ một số dữ liệu / bộ nhớ nhưng chúng không có tác dụng người dùng nhìn thấy đối với các ứng dụng (hy vọng là ngoại trừ thời gian khởi động được cải thiện).

Tuy nhiên, một trường hợp phổ biến là một máy chủ ứng dụng (hoặc "máy chủ web") như Glassfish hoặc Tomcat chạy nhiều ứng dụng web. Trong trường hợp này, nhiều ứng dụng web có thể chia sẻ một JVM.


21

Có một JVM cho mỗi ứng dụng Java. Không nên có bất kỳ kết nối nào giữa chúng trừ khi bạn thiết lập một kết nối, ví dụ như với mạng. Nếu bạn đang làm việc bên trong IDE, mã bạn viết thường chạy trong một JVM riêng biệt. IDE thường sẽ kết nối JVM riêng biệt để gỡ lỗi. Nếu bạn đang xử lý nhiều ứng dụng web, chúng có thể chia sẻ cùng một JVM nếu chúng được triển khai trên cùng một vùng chứa web.


12

Về lý thuyết, bạn có thể chạy nhiều ứng dụng trong một JVM. Trong thực tế, chúng có thể gây nhiễu lẫn nhau theo nhiều cách khác nhau. Ví dụ :

  • JVM có một tập hợp System.in/ out/err , một mã hóa mặc định, một ngôn ngữ mặc định, một tập hợp các thuộc tính hệ thống, v.v. Nếu một ứng dụng thay đổi những điều này, nó sẽ ảnh hưởng đến tất cả các ứng dụng.
  • Bất kỳ ứng dụng nào gọi System.exit()sẽ giết tất cả các ứng dụng.
  • Nếu một luồng ứng dụng bị lỗi và tiêu tốn quá nhiều CPU hoặc bộ nhớ, nó sẽ ảnh hưởng đến các ứng dụng khác.

8

Số JVM đang chạy là số thực thi được gọi. Mỗi ứng dụng như vậy gọi tệp thực thi java của riêng nó (java.exe / javaw.exe etx cho windows) có nghĩa là mỗi ứng dụng đang chạy trong một JVM riêng biệt.


8

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.


5

Bất kỳ ứng dụng nào có các thư viện được chia sẻ sẽ chia sẻ cùng một bản sao của các thư viện đó. Java có một lượng lớn các thư viện được chia sẻ. Tuy nhiên, bạn sẽ không nhận thấy sự khác biệt ngoại trừ một số bộ nhớ được lưu.


2

Ở đây hơi muộn tuy nhiên thông tin này có thể hữu ích cho ai đó. Trong hệ thống Linux, nếu bạn muốn biết có bao nhiêu JVM đang chạy, bạn có thể thử lệnh này

$ ps -ef | grep "[j]ava" | wc -l

psđể liệt kê quá trình, grepđể tìm kiếm quá trình có chứa "java" và wcđếm các dòng trả về


0

Thực sự đây là một câu hỏi có thể có câu trả lời rất khó hiểu. Để giữ cho nó thực sự ngắn gọn:

  1. Có cho mỗi quy trình java, mỗi JVM.
  2. Runtime và ProcessBuilder tuân theo quy tắc này.
  3. Việc tải các bình bằng cách sử dụng phản chiếu và sau đó thực thi chính sẽ không tạo ra JVM mới.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.