Tại sao các đối số JVM bắt đầu bằng “-D”?


81

Tại sao chúng ta cần đặt tiền tố đối số JVM với -Dví dụ: khi chạy một jar từ dòng lệnh? Ví dụ

java -jar -DmyProp="Hello World" myProgram.jar

được sử dụng để chạy myProgram.jarvới tham số hệ thống myProp. Vậy tại sao lại dẫn đầu -D? Tại sao các kiến ​​trúc sư của Java không thể để chúng tôi đơn giản làm:

java -jar -myProp="Hello World" myProgram.jar

Tôi hy vọng một câu trả lời không chỉ là "Bởi vì nó là như vậy".

Câu hỏi bổ sung: Tại sao bức thư -Dtrái ngược với bất kỳ bức thư nào khác, nó có nghĩa là gì?


Lưu ý: Câu hỏi này hỏi tại sao cần phải sử dụng "D", hoặc bất kỳ chữ cái nào khác cho vấn đề đó, ngay từ đầu. Nó ít quan tâm đến việc lựa chọn chữ cái cụ thể "D" hơn bất kỳ chữ cái nào khác, mặc dù đó được hỏi như một câu hỏi bổ sung.

Câu hỏi thưởng có câu trả lời ở đây: Trong java -D, chữ D là viết tắt của gì? .


Đây là một câu hỏi hay cho các nhà phát triển Oracle / Sun. BTW, tại sao đây là một vấn đề đối với bạn?
BackSlash vào

10
@BackSlash Tôi muốn hiểu họ "tại sao" ngoài việc "làm cho mọi thứ hoạt động".
Colm Bhandal

Tất cả các câu trả lời tuyệt vời; tiếc là tôi chỉ có thể chấp nhận một. Cảm ơn các bạn đã khai sáng!
Colm Bhandal


1
@Autar Đó không phải là một bản sao. Mặc dù nó trả lời 'Câu hỏi thưởng', nó không trả lời câu hỏi chính.
Mark Rotteveel

Câu trả lời:


80

Tại sao các kiến ​​trúc sư của Java không thể để chúng tôi đơn giản làm:

java -jar -myProp="Hello World" myProgram.jar

Nó có thể hoạt động ngày hôm nay nhưng giả sử rằng trong các phiên bản Java tiếp theo, một -myPropđối số được giới thiệu dưới dạng tùy chọn JVM.
Làm thế nào để phân biệt tùy chọn của bạn -myPropvới -myProptùy chọn JVM? Không đời nào.
Vì vậy, nó tồn tại một lý do hiển nhiên để sử dụng -Dđể xác định các thuộc tính hệ thống.

Ví dụ khác, thay vì -myPropgiả sử chương trình của bạn dựa trên thuộc -clienttính hệ thống.
Nó sẽ không chạy:

java -jar -client="davidxxx" myProgram.jar

Bạn sẽ gặp lỗi JVM chẳng hạn như:

Tùy chọn không được công nhận: -client = davidxxx

như -clientlà một tùy chọn tiêu chuẩn JVM không mong đợi giá trị.

Nhưng nếu bạn sử dụng -D-client, bây giờ nó ổn vì ở đây -Dclientđược định nghĩa là thuộc tính hệ thống khác với -clienttùy chọn JVM tiêu chuẩn:

java -jar -D-client="davidxxx" myProgram.jar

Hoặc bằng cách sử dụng cả hai:

java -jar -client -D-client="davidxxx" myProgram.jar

Để đi xa hơn, không phải tất cả các đối số JVM đều bắt đầu bằng -D. nhưng hầu hết trong số họ có một tiền tố ( -D, -X, -XX) cho phép trong một cách nọ cách kia để xác định không gian tên.

Bạn có các loại đối số JVM riêng biệt:

1. Tùy chọn tiêu chuẩn ( -Dnhưng không chỉ).

Đây là những tùy chọn được sử dụng phổ biến nhất được hỗ trợ bởi tất cả các triển khai của JVM.

Bạn sử dụng -Dđể xác định thuộc tính hệ thống nhưng hầu hết trong số họ không có bất kỳ tiền tố: -verbose, -showversion, và như vậy cho ...

2. Tùy chọn Không chuẩn (có tiền tố là -X)

Các tùy chọn này là các tùy chọn mục đích chung dành riêng cho Máy ảo Java HotSpot.
Ví dụ: -Xmssize,-Xmxsize

3. Tùy chọn thời gian chạy nâng cao (có tiền tố là -XX)

Các tùy chọn này kiểm soát hành vi thời gian chạy của máy ảo Java HotSpot.

4. Tùy chọn trình biên dịch JIT nâng cao (có tiền tố -XX)

Các tùy chọn này kiểm soát quá trình biên dịch động vừa trong thời gian (JIT) do Java HotSpot VM thực hiện.

5. Tùy chọn khả năng bảo trì nâng cao (có tiền tố là -XX)

Các tùy chọn này cung cấp khả năng thu thập thông tin hệ thống và thực hiện gỡ lỗi mở rộng.

6. Tùy chọn thu gom rác nâng cao (có tiền tố là -XX)

Các tùy chọn này kiểm soát cách thức thực hiện việc thu gom rác (GC) bởi Java HotSpot VM.



38

"Định nghĩa". Ý nghĩa tương tự như định nghĩa tiền xử lý trong C. Dấu hiệu -D biểu thị rằng định nghĩa nằm trong ngữ cảnh của ứng dụng chứ không phải trong ngữ cảnh trình thông dịch Java như bất kỳ tùy chọn nào khác trước tên thực thi.

Việc sử dụng ký tự "D" không được giải thích cụ thể trong tài liệu , nhưng cách sử dụng duy nhất là "xác định" một khóa trong bản đồ thuộc tính hệ thống - ngoại trừ tham chiếu này:

Lớp Hệ thống duy trì một đối tượng Thuộc tính xác định cấu hình của môi trường làm việc hiện tại. Để biết thêm về các thuộc tính này, hãy xem Thuộc tính Hệ thống. Phần còn lại của phần này giải thích cách sử dụng thuộc tính để quản lý cấu hình ứng dụng.


bạn có tài liệu về nó không?
user7294900

Sau gần hai năm, tôi nhận ra rằng, câu trả lời này tuyệt vời như vậy, nó trả lời cho câu hỏi thưởng hơn là giải thích sự cần thiết của một tiền tố nói chung, vì vậy tôi đã chuyển sang một câu trả lời khác là câu được chấp nhận.
Colm Bhandal

11

Nếu bạn không chỉ định bất kỳ điều gì như -myProp = "XYZ", điều đó có nghĩa là nó được truyền như một đối số cho phương thức chính của chương trình.

-D nghĩa là bạn có thể sử dụng giá trị này bằng System.getProperty

-X được sử dụng cho các đối số mở rộng như -Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp: transport = dt_socket, server = y, pause = y, address = 8000

Vâng, họ có thể đã hoán đổi cho nhau .. các ký tự; nhưng những ký tự này được sử dụng để chỉ định loại tham số nào được truyền và ai là người tiêu dùng.


Cảm ơn, tiền tố "X" cũng đã xuất hiện trong tâm trí tôi. Bạn có biết nếu có bất kỳ chữ cái nào khác ngoài "D" và "X" được dành để đặt trước các loại đối số đặc biệt không? Ngoài ra, trong phần trên, tôi thấy bạn có "Djava.compiler" dưới ví dụ cho tiền tố "X". Điều này có chính xác?
Colm Bhandal

3

Nếu không có các -Dthuộc tính sẽ xung đột với các tùy chọn JVM bình thường. Ví dụ, bạn sẽ đặt thuộc tính jarnhư thế nào?

-Dlẽ nó đã được chọn (tôi chỉ có thể suy đoán về điều đó) vì nó cũng được sử dụng trong bộ tiền xử lý C để xác định các ký hiệu và do đó quen thuộc với hầu hết mọi người.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.