2009-02-16 7 views
9

Các Java memory model làm cho nó rõ ràng những gì có thể và không thể được giả định về cách các chủ đề tương tác thông qua bộ nhớ. Ví dụ, nếu một luồng ghi một giá trị mới vào một trường không có đồng bộ hóa thích hợp thì giá trị mới sẽ không được đảm bảo bởi các luồng khác có thể quan sát được. Tuy nhiên, trong thực tế, các chủ đề khác có thể đọc giá trị mới bất chấp đồng bộ hóa không đầy đủ, tùy thuộc vào thời gian giữa ghi và đọc, kiến ​​trúc phần cứng, v.v.Có triển khai trường hợp xấu nhất của JVM không?

Điều này có thể dẫn đến khó phát hiện và khó tái tạo . Do đó, nó có thể hữu ích để chạy một ứng dụng java trên một JVM trường hợp xấu nhất mà hoàn toàn không có sự đồng bộ hóa bộ nhớ giữa các luồng vượt quá các bảo đảm trong Java memory model. Việc thực hiện JVM trường hợp xấu nhất có tồn tại không?

+0

Tôi nghĩ rằng mặt trời đã viết nó. – GEOCHET

+0

Tôi nghĩ rằng Microsoft J + + là nó. –

+3

Cả hai đều nghĩ rằng bạn hài hước, nhưng cả hai đều nói những điều tích cực về Sun và Microsoft thay vì tiêu cực. Nó sẽ là tốt nhất nếu JVM luôn luôn cho thấy kết quả trường hợp xấu nhất từ ​​mô hình bộ nhớ như vậy sẽ tiết lộ các lỗi nhất, nhưng nó không phải là trường hợp ngay bây giờ mà hầu hết các lỗi này được ẩn – Pyrolistical

Trả lời

2

Bạn có thể thử sử dụng Terracotta để nhóm chương trình của mình. Nó là vô cùng unforgiving xung quanh không chính xác đồng bộ hóa (mà sẽ trở nên rõ ràng ngay cả với chỉ có một nút trong cluster). Đây là một câu hỏi lớn : Tôi đã thường muốn chính xác khả năng này - Tôi ngạc nhiên có không phải là một chuyển đổi trong tiêu chuẩn JRE -XXJMMExtreme

Terracotta là mã nguồn mở và miễn phí cho các sản phẩm cơ bản.

0

Tôi không biết bất kỳ máy ảo nào đảm bảo hành vi trường hợp xấu nhất mọi lúc, dường như đó là những gì bạn đang yêu cầu. Tình huống mà bạn mô tả có thể xảy ra với Sun VM (cũng như nhiều máy ảo khác), nhưng chỉ do các vấn đề về bộ nhớ đệm. Tôi không quen thuộc với một máy ảo cố ý làm điều này tất cả các thời gian.

0

Có nhiều cách có thể kích hoạt lỗi đồng thời.

  • Tải ứng dụng của bạn lên nhiều chủ đề khác với bình thường bạn mong đợi. Hãy chắc chắn rằng điều này là quá đủ để có được 99% + CPU.
  • Chạy chương trình của bạn bằng trình kích hoạt profiler hoặc JIT bị vô hiệu hóa. Điều này thay đổi hành vi thời gian của ứng dụng của bạn.
  • Kiểm tra cả Java 5 và Java 6 (Đây thường là cách đơn giản nhất và tốt nhất để tìm một vài lỗi) Tôi không tìm thấy lỗi nào bằng cách sử dụng Java 7 không xuất hiện trong 5/6.

Đối với trường hợp xấu nhất JVM, hãy thử điện thoại di động. (Ứng dụng của bạn có thể sẽ không hoạt động chút nào);)

0

Lỗi đồng bộ thường khó tái tạo vì chúng phụ thuộc vào thời gian tinh tế giữa các luồng khác nhau, do đó không triển khai thực sự cố gắng "chỉ chạy chương trình của bạn" "tồi tệ nhất có thể". Bạn không thể sao chép nhiều hơn một cách khác nhau mà hai luồng có thể xen kẽ hướng dẫn của chúng nếu bạn chỉ thực hiện các hướng dẫn này một lần. Thử nghiệm tất cả các kết hợp như vậy trong một lần chạy đơn lẻ thậm chí còn ít khả thi hơn. Một trong những áp phích khác đã đề xuất Java Pathfinder và có vẻ như là một ý tưởng hay - nhưng lưu ý rằng đó là một ứng dụng chạy cùng một mã nhiều lần, vì vậy bạn không thể thực sự đối xử như một ứng dụng JVM khác.

Một mẹo thực tế khác là thử và chạy ứng dụng trên nhiều JVM khác nhau nhất có thể. Hãy thử các nhà cung cấp khác nhau, các phiên bản khác nhau từ cùng một nhà cung cấp, các kiến ​​trúc CPU khác nhau, v.v. Một vài năm trước, tôi đã có kinh nghiệm với một ứng dụng đa luồng được phát triển, thử nghiệm và chạy trên JVM của Sun trên CPU Xeon nơi nó hoạt động rất tốt. Tại một thời điểm, tôi đã thử chạy nó trên máy ảo Java J9 của IBM trên kiến ​​trúc POWER và lần đầu tiên thử nghiệm, khoảng 2/3 các thử nghiệm không thành công do lỗi đồng bộ hóa.Vì vậy, thử nghiệm trong các môi trường khác nhau có thể khá tốt khi phơi bày các vấn đề đồng bộ hóa ẩn.