Khi nhiều chương trình java chạy trên cùng một máy


83

Mỗi ứng dụng java sẽ chạy trong một Phiên bản máy ảo Java cụ thể. Tôi thực sự đang bối rối về các khía cạnh bên dưới và Google càng làm tôi bối rối hơn. Các bài báo khác nhau trên các trang web khác nhau.

  1. Nếu tôi có một dịch vụ web được viết bằng java, nó sẽ cần một phiên bản JVM để chạy. Vậy JVM có thể được tạo ra một quy trình daemon không?

  2. Nếu có khi chúng tôi chạy bất kỳ ứng dụng java nào khác, nó sẽ sử dụng phiên bản JVM này hay tạo một ứng dụng mới?

  3. Bộ nhớ chính có sẵn trong bất kỳ máy nào là không đổi. Khi chúng ta bắt đầu n quy trình java đồng thời mà không cung cấp bất kỳ kích thước heap ban đầu nào thì kích thước heap được phân phối giữa các quy trình như thế nào?

  4. Có tiến trình nào quản lý n số phiên bản JVM hay do chính hệ điều hành quản lý không?

  5. Khi stop-the-world xảy ra trong GC thì các phiên bản JVM khác (các chủ đề khác mà tôi giả định) có bị ảnh hưởng không?


2
Điểm đầu tiên của bạn phụ thuộc vào việc thực hiện các container ...
MadProgrammer

6
+1 để được giải thích chi tiết và nghiên cứu câu hỏi trước khi hỏi.
amod

Câu trả lời:


80

1) Nếu tôi có một dịch vụ web được viết bằng java, nó sẽ cần một phiên bản JVM để chạy. Vì vậy, JVM có thể được thực hiện một quy trình daemon?

Có nó có thể. Cách thực hiện tùy thuộc vào O / S và chính vùng chứa máy chủ web.

2) Nếu có khi chúng tôi chạy bất kỳ ứng dụng java nào khác, nó sẽ sử dụng phiên bản JVM này hay tạo một ứng dụng mới?

Mỗi ứng dụng Java sử dụng một JVM độc lập.

Mỗi JVM là một quy trình riêng biệt và điều đó có nghĩa là không có sự chia sẻ của các ngăn xếp, đống, v.v. (Nói chung, những thứ duy nhất có thể được chia sẻ là các phân đoạn chỉ đọc chứa mã của JVM lõi và các thư viện gốc ... giống như cách mà các quy trình bình thường có thể chia sẻ các phân đoạn mã.)

3) Bộ nhớ chính có sẵn trong bất kỳ máy nào là không đổi. Khi chúng ta bắt đầu n quy trình java đồng thời mà không cung cấp bất kỳ kích thước heap ban đầu nào thì kích thước heap được phân phối giữa các quy trình như thế nào?

Cơ chế quyết định mức độ lớn để tạo đống nếu bạn không chỉ định kích thước phụ thuộc vào JVM / nền tảng / phiên bản bạn đang sử dụng và việc bạn sử dụng mô hình "máy khách" hay "máy chủ" (đối với Hotspot JVM). Heuristic không tính đến số lượng hoặc kích thước của các JVM khác.

Tham khảo: https://stackoverflow.com/a/4667635/139985

Trong thực tế, có lẽ bạn nên chỉ định kích thước heap trực tiếp.

4) Có tiến trình nào quản lý n số phiên bản JVM hay do chính OS quản lý không?

Cũng không. Số lượng phiên bản JVM được xác định bởi các hành động của nhiều thứ khác nhau có thể bắt đầu quy trình; ví dụ: tập lệnh daemons, tập lệnh lệnh, người dùng gõ lệnh tại dòng lệnh, vân vân. Cuối cùng, Hệ điều hành có thể từ chối bắt đầu bất kỳ quy trình nào nữa nếu nó hết tài nguyên, nhưng các JVM không được coi là khác biệt với các quy trình khác.

5) Khi stop-the-world xảy ra trong GC thì các trường hợp JVM khác (các chủ đề khác mà tôi giả định) có bị ảnh hưởng không?

Không. JVM là các quy trình độc lập. Chúng không chia sẻ bất kỳ trạng thái có thể thay đổi nào. Việc thu gom rác hoạt động trên từng JVM một cách độc lập.


10
  1. xem Làm thế nào để Daemoni hóa một Chương trình Java?
  2. phiên bản mới của JVM sẽ được tạo
  3. giống như cách bộ nhớ được chia sẻ giữa tất cả các quy trình khác
  4. nó được quản lý bởi O / S
  5. các trường hợp khác không bị ảnh hưởng

Nếu các phiên bản của bạn phải điều phối công việc của chúng, bạn có thể tạo một phiên bản chính duy nhất để chạy / dừng các phiên bản khác.

Bạn đã không giải thích lý do tại sao bạn cần nhiều phiên bản JVM. Có lẽ, một phiên bản sẽ hoạt động tốt hơn.

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.