2016-01-22 21 views
7

Từ IBM:Tại sao -Xrs làm giảm hiệu suất

-Xrs

Vô hiệu hóa tín hiệu xử lý trong JVM.

-Xrs

Thiết -Xrs ngăn Java ™ môi trường thời gian chạy từ xử lý bất kỳ tín hiệu nội bộ hay bên ngoài tạo ra như SIGSEGV và SIGABRT. Bất kỳ tín hiệu nào được nâng lên đều được xử lý bởi các trình xử lý hệ điều hành mặc định. Tắt xử lý tín hiệu trong JVM làm giảm hiệu suất khoảng 2-4%, tùy thuộc vào ứng dụng.

-Xrs: đồng bộ

Trên hệ thống UNIX, tùy chọn này sẽ vô hiệu hóa việc xử lý tín hiệu trong JVM cho SIGSEGV, SIGFPE, SIGBUS, SIGILL, SIGTRAP, tín hiệu andSIGABRT. Tuy nhiên, JVM vẫn xử lý tín hiệu SIGQUIT và SIGTERM, trong số những người khác. Như với -Xrs, việc sử dụng -Xrs: đồng bộ giảm hiệu suất khoảng 2-4%, tùy thuộc vào ứng dụng.

Lưu ý: Đặt tùy chọn này ngăn chặn các bãi được tạo bởi JVM cho các tín hiệu như SIGSEGV và SIGABRT, vì JVM không còn chặn các tín hiệu này nữa.

https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.70.doc/diag/appendixes/cmdline/Xrs.html

Từ hiểu biết của tôi, -Xrs thực sự được sử dụng để ngăn chặn bãi từ được tạo ra khi tín hiệu hệ điều hành nhất định được chặn.

Kể từ khi JVM không còn chặn và xử lý các tín hiệu này, nó sẽ đứng để lý do này sẽ tăng hiệu suất, không giảm nó như tuyên bố chủ quyền của IBM.

Tại sao -Xrs giảm hiệu suất?

Trả lời

8

Vì các hoạt động safepoints và VM cũng như các tối ưu hóa khác mà JIT có thể thực hiện nếu bạn cho phép quản lý tín hiệu.

Đôi khi JVM phải thực hiện một số thao tác cần tạm dừng thực thi ("dừng thế giới"), chẳng hạn như thu gom rác quy mô lớn nhất định, tải lại nóng hoặc các lớp biên dịch lại nội bộ và tương tự. Để thực hiện điều này, nó phải đảm bảo rằng tất cả các chuỗi đang chạy nhấn một hàng rào và tạm dừng cùng một lúc, thực hiện thao tác, và sau đó giải phóng các luồng.

Một kỹ thuật mà HotSpot (và có thể là các JVM khác) sử dụng để thực hiện điểm truy cập là lạm dụng thông minh các segfaults: Nó thiết lập một trang bộ nhớ không thực sự được sử dụng cho bất kỳ dữ liệu nào, và sau đó mỗi chuỗi định kỳ đọc từ đó trang. Khi không có hoạt động VM được yêu cầu, việc đọc thành công với chi phí rất thấp và luồng chỉ tiếp tục chạy.

Khi JVM không cần thực hiện thao tác VM, nó sẽ vô hiệu hóa trang bộ nhớ đó.The next time each thread hits a safepoint, it now causes a segfault, cho phép JVM lấy lại quyền kiểm soát việc thực thi luồng đó; nó giữ cho đến khi hoạt động VM được thực hiện, đặt lại trang sentinel và khởi động lại tất cả các chủ đề.

Khi bạn tắt xử lý SIGSEGV, JVM phải sử dụng các kỹ thuật khác để đồng bộ hóa các điểm truy cập an toàn kém hiệu quả hơn so với ủy quyền bảo vệ bộ nhớ trong của bộ xử lý.

Ngoài ra, JVM thực hiện một số phép thuật nghiêm trọng với lược tả (về cơ bản tương tự như dự đoán nhánh của CPU). Một trong những tối ưu hóa nó sử dụng là nếu nó phát hiện ra rằng một kiểm tra null nhất định gần như không bao giờ rỗng, nó sẽ kiểm tra và dựa vào một segfault (đắt tiền, nhưng trong trường hợp hiếm) để bắt null. Việc tối ưu hóa này cũng yêu cầu xử lý tùy chỉnh SIGSEGV.

+0

BTW, tác động của việc bỏ phiếu thông thường không lớn. Các trình xử lý tín hiệu cũng được sử dụng cho các kiểm tra ngầm định, để kiểm tra tràn ngăn xếp (gọi là ngăn xếp ngăn xếp), cho các rào cản bộ nhớ từ xa trên các cuộc gọi phương thức gốc, cho JNI_GetField nhanh, để xử lý ngầm các trường hợp phân chia số nguyên và một số tối ưu hóa khác. – apangin

+0

@apangin Tôi biết rằng JVM sử dụng các thủ thuật cho các hoạt động khác nhưng không quen thuộc với chúng. Tôi khuyến khích bạn viết một câu trả lời mô tả chúng. (Và chỉnh sửa nếu có một thiếu chính xác, bộ nhớ của tôi là HotSpot đã làm một bài kiểm tra nhưng không phải là viết.) – chrylis

+0

Bạn đang phải, HotSpot hiện 'test' trên x86 để bỏ phiếu an toàn. Xin lỗi, tôi đã nhầm lẫn điều này với chồng đập. Tôi nghĩ rằng tất cả các thủ thuật JVM xứng đáng một bài đặc biệt; hy vọng sẽ viết điều này sớm. – apangin

5

Ngoài các điểm truy cập được đề cập bởi bộ xử lý @chrylis segfault cũng được sử dụng cho các thủ thuật tối ưu hóa thông minh khác như kiểm tra con trỏ rỗng ẩn (ít nhất chúng đang ở điểm phát sóng). Nếu các cấu hình cho thấy một đường dẫn mã kiểm tra rỗng hiếm khi được kích hoạt, nó sẽ được tối ưu hóa và trường hợp không chắc chắn sẽ được trình xử lý tín hiệu bao trả.

Không thể thực hiện tối ưu hóa như vậy mà không cần cài đặt trình xử lý tín hiệu tùy chỉnh.

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