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 ( Xms
tùy chọn): 128m hoặc 256m?
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 ( Xms
tùy chọn): 128m hoặc 256m?
Câu trả lời:
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());
}
}
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.
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize
, theo cách này sẽ dễ dàng suy luận hơn.
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.
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.
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}