2009-09-17 40 views
8

Tôi đang thực hiện một JVM (java.exe) khác từ ứng dụng chính. Có cách nào để chia sẻ một đối tượng (đối tượng khá lớn) với quy trình mới được tạo ra (tại thời điểm tạo hoặc sau khi nó được tạo).Chia sẻ các đối tượng trên các quy trình Java

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec("java -cp " + tempDir + jarsInPath + " " + appMain); 

Bây giờ tôi muốn các đối tượng như vậy để được cung cấp cho quá trình được biểu thị bởi các đối tượng proc

Liệu ProcessBuilder cung cấp bất kỳ tiện ích cho mục đích này?

Trả lời

0

Không có hỗ trợ bộ nhớ dùng chung nào trong Java.

Cách đơn giản nhất để giải quyết vấn đề này là sắp xếp lại đối tượng vào một tệp tạm thời và sau đó deserialize nó trở lại trong JVM mới.

+0

Tôi đang làm việc với trình biên dịch (phần mở rộng của Java). Tôi phải tiền xử lý AST để tạo ra các AST khác nhau. Để xử lý, tôi phải gọi lại trình biên dịch. Thay vì thực hiện chúng một cách riêng biệt, tôi muốn sắp xếp hợp lý quá trình này. Hiện tại, tôi đơn giản phân tích lại chương trình java gốc trong quy trình mới. Tôi đã thử serializing nhưng nó là một đối tượng lớn (một chương trình hoàn chỉnh để được chính xác) với nhiều cấu trúc dữ liệu. – user174819

1

Bạn có thể hiển thị dịch vụ để cho phép truy cập dữ liệu từ đối tượng. Nó tương đối đơn giản để thiết lập giao tiếp giữa các quá trình bằng RMI. Sẽ có chi phí IPC vì vậy điều này sẽ không hoạt động như truy cập cục bộ, truy cập chi tiết sẽ tốn kém, nhưng nếu bạn đang tóm tắt hoặc dữ liệu được tổng hợp khác thì đây có thể là một mô hình khá.

Bạn không nói lý do tại sao đây là các quy trình riêng biệt. Bạn có cơ hội nào để tải mã của quy trình con bạn trực tiếp vào phụ huynh không? Có thể tải và tải động.

+0

Làm cách nào để 'oad mã của quy trình con bạn trực tiếp vào cha mẹ'. Ngoài ra tôi không muốn có được dữ liệu từ quá trình con chỉ gửi dữ liệu từ quá trình cha mẹ cho quá trình con? – user174819

+0

Cha mẹ-> con, con-> cha mẹ, không tạo ra sự khác biệt, một cung cấp dịch vụ mà người kia gọi nó. Nhưng câu hỏi chính của tôi là tại sao họ là những quy trình riêng biệt? Chỉ cần có một quy trình lớn, với các chủ đề thực hiện các công việc khác nhau. Tùy thuộc vào nhu cầu của bạn, bạn chỉ có thể liên kết một chương trình lớn hoặc tải động các lớp bằng cách sử dụng các API Java chuẩn – djna

+0

Người ta có thể nghĩ đây là giới hạn của mô hình kiến ​​trúc JVM. Nó trở nên khá khó khăn để cung cấp các lớp dịch vụ thiếu cơ sở này. Ngay cả massage đi qua hệ điều hành sẽ sử dụng các đối tượng và dịch vụ được chia sẻ. – will

3

Nếu bạn muốn chia sẻ các đối tượng, cách tốt nhất là sử dụng các chuỗi thay vì một quy trình riêng biệt. Các tiến trình không thể chia sẻ bộ nhớ (ngoại trừ thông qua JNI), vì vậy bạn phải sao chép đối tượng lớn qua lại ở dạng tuần tự, hoặc thông qua tệp hoặc qua kết nối socket RMI (sau này là tùy chọn tốt hơn vì kết quả là đồng bộ hóa vốn có) .

+0

Chủ đề có thể được sử dụng để khởi động một JVM khác (java.exe) như mã được hiển thị ở trên không? Tôi đã luôn luôn nhìn thấy quá trình đang được sử dụng để bắt đầu một JVM. – user174819

+0

Không, bạn không thể bắt đầu một JVM khác - sau đó nó sẽ là một quá trình, không phải là một luồng. Nhưng bạn có thực sự CẦN một JVM khác không? Bạn có thể không chỉ thực hiện phương thức main() mà bạn muốn khởi động JVM mới bằng một chuỗi thay thế? –

0

Tôi nghĩ bạn có thể sử dụng bộ đệm phân tán cho các mục đích này (EHCache, memcached ...)

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