2009-03-26 34 views
14

Tôi tưởng tượng rằng không, chúng không phải là, bởi vì mọi quá trình đều có không gian bộ nhớ riêng của nó, tất nhiên.Trong Java, các thành viên lớp tĩnh có được chia sẻ giữa các chương trình không?

Nhưng toàn bộ điều JVM thực sự hoạt động như thế nào? Có một JVM riêng biệt trong một quy trình riêng biệt cho mọi chương trình Java mà tôi khởi chạy không? Các chương trình Java chạy trong hệ thống có chia sẻ gì không? Có sự khác nhau giữa các hệ điều hành và triển khai JVM không? Tôi có thể làm cho các chương trình chia sẻ các biến (ví dụ: trực tiếp thông qua JVM thay vì các cơ chế IPC thông thường) không? Có các JVM một quy trình kỳ lạ hơn cho các mục đích đặc biệt không?

Thông thường, những gì được khuyến nghị đọc về ruột của JVM? spec? Mã nguồn của một số triển khai? Trang web? Sách?

Trả lời

23

Trong Java, là các thành viên lớp tĩnh được chia sẻ giữa các chương trình?

Một lớp được định nghĩa bằng tên đầy đủ và trình nạp lớp đã tải nó. Nếu cùng một lớp nằm trong cùng một quá trình JVM và hai chương trình nạp lớp thông qua cùng một trình nạp lớp thì các thành viên tĩnh được chia sẻ. Quy tắc xếp lớp là cực kỳ quan trọng.

Tôi tưởng tượng rằng không, chúng không phải là, vì mọi quy trình đều có không gian bộ nhớ riêng của mình, tất nhiên là .

Nếu bạn đang sử dụng hai JVM riêng biệt để khởi chạy hai ứng dụng, bạn chính xác. Nhưng lấy trường hợp của các thùng chứa ứng dụng/servlet như tomcat: chúng tải một số ứng dụng thông qua cùng một quá trình (quy trình máy chủ tomcat).

Nhưng toàn bộ điều JVM thực sự hoạt động như thế nào? Có một JVM riêng biệt trong một quy trình riêng biệt cho mọi chương trình Java mà tôi khởi chạy không? Thực hiện các chương trình Java chạy trong hệ thống chia sẻ có gì không?

Mỗi lần bạn nhập >java -cp... tại dòng lệnh, bạn đang tạo quy trình mới. Hãy nhớ rằng khi bạn chạy eclipse hoặc gọi một tác vụ java kiến ​​với fork=true bạn cũng đang tạo ra các quy trình mới.

Có sự khác biệt nào giữa các hệ điều hành và triển khai JVM không? Tôi có thể thực hiện các chương trình chia sẻ các biến (i. E. trực tiếp thông qua JVM thay vì các cơ chế IPC thông thường) không? Có các JVM một quy trình kỳ lạ khác cho các mục đích đặc biệt không?

Giống như một áp phích cho biết, có những dự án như Terracota tạo điều kiện thuận lợi cho bạn. Cách tiếp cận chung cho loại chia sẻ này là bộ nhớ cache được phân phối.

+0

Câu trả lời hay. Cảm ơn :) – mac

6

Không, biến tĩnh không nằm giữa các JVM. Có, có một quy trình JVM riêng biệt cho từng ứng dụng Java bạn chạy.

Trong một số triển khai, tôi tin rằng họ có thể chia sẻ một số tài nguyên (ví dụ: bộ nhớ cho mã JIT của các lớp JRE) nhưng tôi không chắc chắn. Tôi tin rằng có công việc liên tục để cho phép chia sẻ nhiều hơn, nhưng vẫn theo một cách mạnh mẽ. (Bạn thực sự không muốn một JVM gặp sự cố ảnh hưởng đến người khác.)

Không, bạn không thể làm cho các chương trình chia sẻ các biến một cách minh bạch.

Tôi tin rằng có những cuốn sách về JVM, nhưng tôi không thể đề xuất bất kỳ sách nào. Có lẽ bạn nên tìm kiếm các giấy trắng HotSpot để biết chi tiết về điều đó. This one là điểm khởi đầu khá tốt.

1

Bạn đúng trong giả định của mình. Có, mỗi JVM là một quá trình riêng biệt. Bạn có thể xác nhận điều này bằng cách mở Trình quản lý tác vụ khi bạn đang chạy hai chương trình Java (sắp xếp các quy trình theo tên và tìm java.exe hoặc javaw.exe).

Có thể làm cho JVM kết nối với nhau (với ổ cắm địa phương, ví dụ), nhưng không có gì được xây dựng tại là.

6

có lẽ bạn nên tìm kiếm ở những khu vực của lớp tải nếu quan tâm chính của bạn là về các thành viên lớp tĩnh được khởi tạo như thế nào.

Các luồng khác nhau trên cùng một máy ảo có thể có các cá thể lớp tháng mười hai tĩnh của riêng chúng nếu chúng sử dụng trình nạp lớp riêng biệt.

Ví dụ điển hình ở đây sẽ là Apache Tomcat giữ các ứng dụng web khác nhau riêng biệt, mặc dù bình lib có thể là phổ biến đối với tất cả các ứng dụng.

+1

+1 cho trình nạp lớp, đó là những gì xác định phạm vi của biến tĩnh. Không cụ thể cho luồng mặc dù, vì trình nạp lớp có thể thay đổi ngay cả trên một luồng thực thi đơn lẻ. Khá phổ biến trong môi trường JEE và OSGi. – Robin

2

Phụ thuộc vào việc triển khai, nhưng có những cách mà mọi thứ được chia sẻ. Có/đã được tiến hành để thay đổi điều đó, và Sun (thông qua Apple) đã thực hiện rất nhiều công việc trong việc chia sẻ dữ liệu giữa các cá thể của máy ảo. Có một liên kết thảo luận về một số trong số đó here.

Để thực hiện bất kỳ loại chia sẻ nào yêu cầu người triển khai VM thực hiện điều đó, bạn là người lập trình không thể làm bất cứ điều gì để thực hiện điều đó.

Thông số VM là here, cũng có một số sách cũ hơn về nó. Bạn cũng có thể xem mã nguồn cho Kaffe vốn khá nhỏ.

2

Nếu bạn muốn chia sẻ các biến trên các JVM, bạn có thể xem xét các sản phẩm phân cụm như Terracotta.Chúng tự coi mình là "bộ nhớ gắn kèm mạng" và cho phép bạn chia sẻ các tham chiếu đối tượng trên các JVM bằng cách sử dụng công nghệ sao chép.

1

Chỉ cần làm theo những gì Kevin đã đề cập, không có triển khai JVM nào mà tôi biết điều đó cho phép bạn chia sẻ các biến tĩnh trên các cá thể JVM. Như các câu trả lời trước đã nêu (chính xác) - mỗi cá thể JVM là quá trình riêng của nó.

Đất nung (là công nghệ phân cụm, không phải JVM) cho phép chia sẻ tùy ý các cá thể đối tượng trên các ranh giới quy trình JVM - bao gồm chia sẻ các biến tĩnh. Vì vậy, biệt danh "mạng gắn bộ nhớ". Đối với tất cả các ý định và mục đích, khi sử dụng công nghệ Terracotta trong quá trình JVM của bạn, tất cả các luồng trong tất cả các máy ảo hoạt động như thể tất cả chúng đều đang xem một đống lớn, chia sẻ. (Tất nhiên, vì điều đó không thể thực hiện được, Terracotta quản lý nó thông qua các thuật toán chia sẻ và sao chép phức tạp liên quan đến io mạng để di chuyển dữ liệu - do đó có thời gian khi độ trễ và thông lượng sẽ không so sánh với truy cập bộ nhớ riêng)

Có rất nhiều ví dụ trong phần Cookbook của trang web Terracotta - Tôi khuyên bạn nên bắt đầu với Hello Clustered Instance Recipe để có được cảm giác về cách hoạt động của nó.

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