Các tùy chọn thời gian chạy Java trùng lặp: thứ tự ưu tiên là gì?


81

Xem xét dòng lệnh sau

java -Xms128m -Xms256m myapp.jar

Cài đặt nào sẽ áp dụng cho JVM Bộ nhớ tối thiểu ( Xmstùy chọn): 128m hoặc 256m?


16
Không có lỗi đánh máy trong câu hỏi. Tùy chọn Xms được sử dụng hai lần vào mục đích. Đây là nội dung của câu hỏi
fabien7474

Câu trả lời:


28

Phụ thuộc vào JVM, có lẽ là phiên bản ... thậm chí có thể là bạn có bao nhiêu chiếc kẹp giấy trên bàn của mình vào thời điểm đó. Nó thậm chí có thể không hoạt động. Đừng làm vậy.

Nếu nó nằm ngoài tầm kiểm soát của bạn vì lý do nào đó, hãy biên dịch và chạy nó giống như cách bạn chạy jar của mình. Nhưng được cảnh báo, dựa vào thứ tự của các tùy chọn là một ý tưởng thực sự tồi.

public class TotalMemory
{
    public static void main(String[] args)
    {
         System.out.println("Total Memory: "+Runtime.getRuntime().totalMemory());
         System.out.println("Free Memory: "+Runtime.getRuntime().freeMemory());
    }
}

2
+1 - tốt hơn hãy đếm những tờ giấy lộn đó :-). Nghiêm túc mà nói, không phải là khoa học tên lửa để thay đổi bất cứ điều gì đang vượt qua những lập luận mơ hồ đó.
Stephen C

4
đang thử với số lượng kẹp giấy khác nhau. không thể tìm thấy công tắc để là người đầu tiên
OganM

65

Như mọi khi, hãy kiểm tra việc triển khai cụ thể của JVM cục bộ của bạn nhưng đây là một cách nhanh chóng để kiểm tra từ dòng lệnh mà không cần phải viết mã.

> java -version; java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
uintx MaxHeapSize         := 2147483648        {product}

Vì vậy, bạn sẽ thấy trong trường hợp này, ví dụ thứ hai của đối số (2G) là thứ được ưu tiên (ít nhất là trong 1.8) và đó cũng là kinh nghiệm của tôi với hầu hết các phiên bản hiện đại khác.


8
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize, theo cách này sẽ dễ dàng suy luận hơn.
ryenus

40

IBM JVM coi trường hợp ngoài cùng bên phải của một đối số là người chiến thắng. Tôi không thể nói chuyện với HotSpot, v.v.

Chúng tôi làm điều này vì thường có các dòng lệnh được lồng sâu từ các tệp hàng loạt nơi mọi người chỉ có thể thêm vào cuối và muốn biến đó thành người chiến thắng.


21
+1 để thực sự trả lời câu hỏi thay vì chỉ trích.
JimN


37

FTR, OpenJDK 1.7 dường như cũng có giá trị ngoài cùng bên phải, ít nhất là đối với -Xms.


14
+1 để thực sự trả lời câu hỏi thay vì chỉ trích.
JimN

1
cũng giống như CSS, người thắng muộn hơn
ryenus

9

Tôi cá đó là cái thứ hai. Các đối số thường được xử lý theo thứ tự:

for( int i=0; i<argc; i++ ) {
  process_argument(argv[i]);
}

Nhưng nếu tôi đang viết trình phân tích cú pháp đối số java, tôi sẽ phàn nàn về các đối số mâu thuẫn.


7

Cài đặt nào sẽ áp dụng cho Bộ nhớ tối thiểu JVM?

Trong các phiên bản Java khác nhau được liệt kê bên dưới, "chiến thắng" là giá trị ngoài cùng bên phải trong danh sách đối số. Như những người khác đã chỉ ra, không phải là một ý kiến ​​hay nếu dựa vào điều này, nhưng có lẽ đây là thông tin hữu ích để chia sẻ.

Java 1.8.0_172

~ $ java8
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
    uintx MaxHeapSize                              := 4219469824                          {product}

Java 11.0.3

~ $ java11
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

OpenJDK 12.0.1

~ $ java12
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

AdoptOpenJDK 12.0.1

~ $ java12a
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

OpenJDK 13-ea

~ $ java13
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+22)
OpenJDK 64-Bit Server VM (build 13-ea+22, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}
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.