2013-08-23 42 views
65

Mỗi ứng dụng java sẽ chạy trong một Java Virtual Machine Instance cụ thể. Tôi thực sự bối rối về các khía cạnh bên dưới và Googling đã làm tôi bối rối hơn nữa. Các bài viết khác nhau trên các trang web khác nhau.Khi nhiều chương trình java chạy trên cùng một máy

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

  2. Nếu có khi chúng tôi chạy bất kỳ ứng dụng java nào khác, ứng dụng này sẽ sử dụng phiên bản JVM này hoặc tạo một phiên bản 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 tôi bắt đầu n java quy trình đồng thời mà không cung cấp bất kỳ kích thước heap ban đầu như thế nào là kích thước heap phân phối giữa các quy trình?

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

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

+2

Điểm đầu tiên của bạn phụ thuộc vào việc triển khai vùng chứa ... – MadProgrammer

+3

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

Trả lời

58

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

Có thể. Làm thế nào nó được thực hiện phụ thuộc vào O/S và trên máy chủ web container chính nó.

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

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

Mỗi JVM là một quá trình riêng biệt và điều đó có nghĩa là không có chia sẻ ngăn xếp, đống, v.v. (Nói chung, những điều duy nhất có thể được chia sẻ là các phân đoạn chỉ đọc giữ mã của JVM lõi và thư viện gốc ... giống như cách các quy trình thông thường có thể chia sẻ các đ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 tôi bắt đầu n java quy trình đồng thời mà không cung cấp bất kỳ kích thước heap ban đầu như thế nào là kích thước heap phân phối giữa các quy trình?

Cơ chế quyết định mức độ lớn 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à liệu bạn có sử dụng mô hình "máy khách" hay "máy chủ" hay không (cho các JVM Hotspot). Các 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ế, bạn có lẽ sẽ tốt hơn hết xác định kích thước heap trực tiếp.

4) Có quá trình nào quản lý n số phiên bản JVM hay nó được quản lý bởi chính hệ điều hành không?

Không. Số lượng các cá thể 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 các quá trình; ví dụ. daemon script, script lệnh, người dùng gõ lệnh tại dòng lệnh, etcetera. Cuối cùng, hệ điều hành có thể từ chối bắt đầu thêm bất kỳ quy trình nào nếu nó hết tài nguyên, nhưng các JVM không được xử lý bất kỳ khác với các quy trình khác.

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

No. JVM là các quy trình độc lập. Họ không chia sẻ bất kỳ trạng thái có thể thay đổi nào. Thu gom rác hoạt động độc lập trên mỗi JVM.

+0

cảm ơn thông tin – Madhuri

6
  1. thấy How to Daemonize a Java Program?
  2. dụ mới của JVM sẽ được tạo
  3. cách tương tự như bộ nhớ được chia sẻ giữa tất cả các quá trình khác
  4. nó được quản lý bởi O/S
  5. trường hợp khác không bị ảnh hưởng

Nếu trường hợp của bạn phải phối hợp công việc của họ, bạn có thể tạo một cá thể chính duy nhất sẽ 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ẽ, ví dụ đơn lẻ sẽ hoạt động tốt hơn.

Các vấn đề liên quan