2012-11-24 38 views
9

Tôi đọc rằng mỗi ứng dụng chạy trong JVM của riêng nó. Tại sao nó như vậy ? Tại sao họ không làm cho một JVM chạy 2 hoặc nhiều ứng dụng hơn?Tại sao có một JVM cho mỗi ứng dụng?

Tôi đã đọc một bài đăng SO, nhưng không thể nhận được câu trả lời ở đó. Is there one JVM per Java application?

tôi đang nói về các ứng dụng khởi chạy thông qua một phương pháp public static void main (String []) ...)

+1

Tôi e rằng chúng tôi sẽ không thể cung cấp cho bạn nhiều hơn là đã có trong câu hỏi khác. –

+0

@JanDvorak - là tích cực và hy vọng :) –

Trả lời

25

(tôi giả sử bạn đang nói về các ứng dụng khởi chạy thông qua một phương pháp public static void main(String[]) ...)

Về lý thuyết, bạn có thể chạy nhiều ứng dụng trong một JVM. Trong thực tế, họ có thể can thiệp lẫn nhau theo nhiều cách khác nhau. Ví dụ:

  • JVM có một bộ System.in/out/err, một mã hóa mặc định, một ngôn ngữ mặc định, một bộ thuộc tính hệ thống, v.v. Nếu một ứng dụng thay đổi chúng, 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 chuỗi ứng dụng bị hoang chuyển và tiêu thụ quá nhiều CPU hoặc bộ nhớ, nó sẽ ảnh hưởng đến các ứng dụng khác.

Tóm lại, có rất nhiều vấn đề. Mọi người đã cố gắng hết sức để thực hiện công việc này, nhưng họ chưa bao giờ thực sự thành công. Một ví dụ là thư viện Echidna, mặc dù dự án đó đã được yên tĩnh trong ~ 10 năm. JNode là một ví dụ khác, mặc dù chúng (thực sự là chúng ta) "lừa" bằng cách hack các lớp Java lõi (như java.lang.System) để mỗi ứng dụng nhận được những gì dường như là các phiên bản độc lập của System.in/out/err, các thuộc tính hệ thống và cứ như vậy .

1 - Điều này ("proclets") được cho là một bản hack tạm thời, đang chờ giải pháp thích hợp sử dụng đúng "cách ly". Nhưng sự cô lập hỗ trợ bị đình trệ, chủ yếu là do kiến ​​trúc JNode đã sử dụng một không gian địa chỉ đơn lẻ mà không có cách nào rõ ràng để tách riêng các công cụ "hệ thống" và "người dùng". Vì vậy, trong khi chúng ta có thể tạo các API khớp với các API cô lập, chức năng cô lập khóa (như giết chết một cách cô lập) hầu như không thể thực hiện được. Hoặc ít nhất, đó là/là quan điểm của tôi.

+0

Cảm ơn câu trả lời hay. Tôi có thể đọc thêm về điều này ở đâu? –

+0

Đã thêm một vài liên kết ... –

2

Đối với cô lập bối cảnh thực hiện.

Nếu một trong các quy trình bị treo hoặc không thành công hoặc bảo mật bị xâm phạm, những người khác sẽ không bị ảnh hưởng.

Tôi nghĩ có các thời gian chạy riêng biệt cũng giúp GC, bởi vì nó có ít tham chiếu hơn để xử lý hơn là hoàn toàn.

Ngoài ra, tại sao bạn sẽ chạy tất cả trong một JVM?

+0

okay, vì vậy hộp cát trong java đã có một cái gì đó để làm với những gì bạn nói? –

+0

@AppleGrinder gọi nó là "hộp cát" nghe có vẻ hơi quá mức với tôi. Đó là sandboxing vì nó chạy mỗi chương trình trong một tiến trình hệ điều hành riêng biệt ... Tôi không chắc chắn tôi sẽ gọi đó là một sandbox, bởi vì họ có cách can thiệp với nhau, nhưng đó không phải là mặc định. – mgarciaisaia

+0

@ desert69: Bạn nói gì? xin vui lòng kiểm tra bình luận của tôi chỉ hiển thị trên câu trả lời của bạn. Cảm ơn và kính trọng. –

1

máy chủ ứng dụng Java như JBoss, được thiết kế để chạy nhiều ứng dụng trong một JVM

+0

Bạn đã học ở đâu? –

+1

Đó là các ứng dụng ** web ** không phải là ứng dụng chung. –

+0

@StephenC - các ứng dụng chung khác với các ứng dụng web như thế nào, đặc biệt trong ngữ cảnh của câu hỏi này? –

6

Lý do để có một ứng dụng trước JVM, về cơ bản tương tự có quá trình hệ điều hành cho mỗi ứng dụng. Dưới đây là một vài lý do tại sao phải có quy trình cho mỗi ứng dụng.

  • Lỗi ứng dụng sẽ không làm hỏng/hỏng dữ liệu trong các ứng dụng khác chia sẻ cùng một quy trình.
  • Tài nguyên hệ thống được tính cho mỗi quy trình do đó cho mỗi ứng dụng.
  • Quá trình chấm dứt sẽ tự động giải phóng tất cả các tài nguyên liên quan (ứng dụng có thể không tự dọn sạch, vì vậy việc chia sẻ quy trình có thể gây rò rỉ tài nguyên).

Một số ứng dụng như Chrome thậm chí còn tạo thêm nhiều quy trình để tách biệt các tab và plugin khác nhau.

Nói về Java có một vài lý do khác không chia sẻ JVM.

  • Hình phạt bảo trì không gian lưu trữ cao hơn với kích thước heap lớn. Nhiều heap độc lập nhỏ hơn dễ quản lý hơn.
  • Rất khó để tải "ứng dụng" trong JVM (có nhiều lý do tinh vi để nó ở trong bộ nhớ ngay cả khi nó không chạy).
  • JVM có rất nhiều tùy chọn điều chỉnh mà bạn có thể muốn điều chỉnh cho một ứng dụng.

Mặc dù có một số trường hợp có JVM là thực sự chia sẻ giữa các ứng dụng: Máy chủ

  • Ứng dụng và container servlet (ví dụ Tomcat). Các đặc tả Java phía máy chủ được thiết kế với JVM máy chủ dùng chung và các ứng dụng tải/bốc xếp động.
  • vài nỗ lực có để tạo ra tiện ích JVM chia sẻ cho các ứng dụng CLI (ví dụ nailgun)

Nhưng trong thực tế, ngay cả trong máy chủ bên java, nó thường tốt hơn để sử dụng JVM (hoặc một số) cho mỗi ứng dụng, vì những lý do nêu ở trên.

+1

Từ cuốn sách nào, trang web tôi có thể tìm hiểu tất cả những điều này? Cảm ơn. –

+0

Không có sách/trang web. AFAIK. Công cụ này là tất cả ý nghĩa thông thường ... nếu bạn hiểu các API Java, v.v. –

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