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.