2009-07-13 28 views
12

Tôi thấy thông số này ở tất cả các loại địa điểm (diễn đàn, v.v.) và câu trả lời chung giúp các máy chủ đồng thời cao. Tuy nhiên, tôi không thể tìm thấy một tài liệu chính thức từ mặt trời giải thích những gì nó làm. Ngoài ra, nó được thêm vào trong Java 6 hay nó đã tồn tại trong Java 5 chưa?Java -XX: + Thông số UseMembar của Java là gì

(BTW, một nơi tốt cho nhiều thông số hotspot VM là this page)

Cập nhật: Java 5 không khởi động với tham số này.

+1

BTW: -XX tùy chọn không được hỗ trợ chính thức và có thể bị xóa khỏi các bản phát hành trong tương lai mà không cần thông báo. –

+0

@Rastislav đúng, nhưng trong nhiều trường hợp, bạn cần phải sử dụng chúng ... –

Trả lời

11

Để tối ưu hóa hiệu suất, JVM sử dụng "rào cản bộ nhớ giả" trong mã để hoạt động như một hướng dẫn đấu kiếm khi đồng bộ hóa trên nhiều bộ xử lý. Có thể hoàn nguyên về hướng dẫn rào cản bộ nhớ "đúng", nhưng điều này có thể có hiệu ứng đáng chú ý (và xấu) khi thực hiện.

Việc sử dụng -XX:+UseMembar làm cho máy ảo hoàn nguyên về hướng dẫn rào cản bộ nhớ thực. Tham số này ban đầu được dự định tồn tại tạm thời như một cơ chế xác minh của logic giả rào mới, nhưng hóa ra là mã rào cản giả bộ nhớ mới đã giới thiệu một số vấn đề đồng bộ hóa. Tôi tin rằng đây là những cố định, nhưng cho đến khi chúng được, cách chấp nhận được để giải quyết những vấn đề này là sử dụng cờ được phục hồi.

Lỗi được giới thiệu ở 1.5 và tôi tin rằng cờ này tồn tại trong 1.5 và 1.6.

Tôi đã google-fu'ed này từ một loạt các danh sách gửi thư và lỗi JVM:

+1

Điều tôi không biết (và muốn) là cách mã rào cản giả hoạt động ... – butterchicken

+0

Xem thêm http: //bugs.sun .com/bugdatabase/view_bug.do? bug_id = 6822370: trên các CPU và máy ảo mới hơn với lỗi này, bạn có thể có các vấn đề đồng bộ hóa rất lẻ (được sửa trong 6u18) – ankon

1

tôi don không đồng ý với câu trả lời từ bơ. Trang này http://www.md.pp.ru/~eu/jdk6options.html nói rằng cờ này gây ra các rào cản bộ nhớ được ban hành sau đó thay đổi chủ đề là trạng thái (từ RUNNABLE sang WAITING hoặc thành BLOCKED).

+0

Tôi đoán chúng ta cần các nhà phát triển JVM từ Sun o trả lời ... –

4

bơ chỉ giải thích một nửa câu chuyện, tôi muốn tăng thêm chi tiết cho câu trả lời của kmatveev. Có, tùy chọn dành cho các thay đổi trạng thái luồng và (pseudo) các rào cản bộ nhớ được sử dụng để đảm bảo rằng sự thay đổi có thể nhìn thấy được từ các luồng khác, đặc biệt là luồng VM. Các trạng thái chủ đề được sử dụng trong OpenJDK6 như sau:

// _thread_new   : Just started, but not executed init. code yet (most likely still in OS init code) 
// _thread_in_native : In native code. This is a safepoint region, since all oops will be in jobject handles 
// _thread_in_vm  : Executing in the vm 
// _thread_in_Java  : Executing either interpreted or compiled Java code (or could be in a stub) 
... 
_thread_blocked   = 10, // blocked in vm 

Nếu không có tùy chọnChọn tùy chọnMembar, trong Linux, Hotspot sử dụng trang tuần tự bộ nhớ thay vì lệnh rào cản bộ nhớ. Bất cứ khi nào một quá trình chuyển đổi trạng thái luồng xảy ra, luồng ghi vào một địa chỉ bộ nhớ trong trang tuần tự bộ nhớ với con trỏ dễ bay hơi. Khi luồng VM cần xem xét trạng thái cập nhật của tất cả các luồng, VM thay đổi các bit bảo vệ cho trang serialize của bộ nhớ để chỉ đọc và sau đó phục hồi nó để đọc/ghi để thay đổi trạng thái tuần tự hóa. Nhiều cơ chế chi tiết được giới thiệu trong các trang sau đây:

http://home.comcast.net/~pjbishop/Dave/Asymmetric-Dekker-Synchronization.txt

2

UseMembar xác định có hay không sử dụng hướng dẫn membar một cách nghiêm ngặt, buộc tất cả các hành động bộ nhớ để hoàn thành trước khi tiếp tục.

Về cơ bản, việc dừng tối ưu hóa xử lý bộ nhớ bị trì hoãn của bộ vi xử lý từ việc rối tung với mã được xử lý.

Điều này thường làm chậm mọi thứ và không cần thiết trên các máy ảo hiện đại cho phần lớn mã.

Thỉnh thoảng bạn gặp phải các vấn đề trong đó mã NÊN được an toàn chỉ nhưng không phải vì thiếu sử dụng lệnh ghi nhớ. Trong những trường hợp này, bạn có thể bật tính năng này để nhận mã như vậy để hoạt động mà không cần phải chuyển sang luồng đơn hoặc làm rối tung xung quanh với thứ tự mã để ngăn chặn sự cố.

JVM thường phát hiện mã sẽ gây ra sự cố và chèn một thanh ghi hoặc thực hiện mã JIT sắp xếp lại tối ưu để cung cấp thời gian cho thao tác bộ nhớ hoàn tất. Trong thực tế, trong tìm kiếm trên web của tôi về chủ đề này, tôi chỉ tìm thấy một ví dụ về lỗi và nó đã được sửa trong các phiên bản gần đây của cả hai phiên bản Oracle và OpenJRE của JVM hotspot. Một lưu ý, đối với kiến ​​trúc ARM, tùy chọn này vẫn mặc định bật, vì tối ưu hóa thay thế (được gọi là tối ưu hóa psuedo-membar) chưa được áp dụng, và do đó nó có thể rất lỗi mà không có hướng dẫn của membar.

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