Các tham số -Xms và -Xmx khi khởi động JVM là gì?


1008

Vui lòng giải thích việc sử dụng XmsXmxcác tham số trong JVM. Các giá trị mặc định cho chúng là gì?


2
Khi sử dụng, -Xmx128m -Xms64mnó có thể đạt cực đại xung quanh 275mRES mem, nhưng khi sử dụng, -Xmx128m -Xms128mnó có thể đạt cực đại xung quanh 550mRES mem Sử dụng Java 8 Điều tốt nhất là nhấn mạnh vào GC và xem xét điều gì xảy ra ...
Barshe Roussy

Câu trả lời:


1360

Cờ Xmxchỉ định nhóm cấp phát bộ nhớ tối đa cho máy ảo Java (JVM), trong khi Xmschỉ định nhóm cấp phát bộ nhớ ban đầu.

Điều này có nghĩa là JVM của bạn sẽ được bắt đầu với dung Xmslượng bộ nhớ và sẽ có thể sử dụng tối đa dung Xmxlượng bộ nhớ. Ví dụ, bắt đầu một JVM như bên dưới sẽ khởi động nó với 256 MB bộ nhớ và sẽ cho phép quá trình sử dụng tới 2048 MB bộ nhớ:

java -Xms256m -Xmx2048m

Cờ nhớ cũng có thể được chỉ định ở các kích cỡ khác nhau, chẳng hạn như kilobyte, megabyte, v.v.

-Xmx1024k
-Xmx512m
-Xmx8g

Các Xmscờ không có giá trị mặc định, và Xmxthường có một giá trị mặc định là 256 MB. Một cách sử dụng phổ biến cho những lá cờ này là khi bạn gặp phải a java.lang.OutOfMemoryError.

Khi sử dụng các cài đặt này, hãy nhớ rằng các cài đặt này dành cho heap của JVM và JVM có thể / sẽ sử dụng nhiều bộ nhớ hơn chỉ là kích thước được phân bổ cho vùng heap. Từ tài liệu của Oracle :

Lưu ý rằng JVM sử dụng nhiều bộ nhớ hơn chỉ là heap. Ví dụ, các phương thức Java, các ngăn xếp luồng và các thẻ điều khiển riêng được phân bổ trong bộ nhớ tách biệt với heap, cũng như các cấu trúc dữ liệu bên trong JVM.


12
Vì vậy, nó giống như khi sử dụng bộ nhớ vượt quá Xmx, chúng tôi nhận được jvm ngoại trừ bộ nhớ.
Pankaj

59
Vâng đúng rồi. Khi nó cố gắng vượt quá mức đó, mặc dù nó có thể thu gom rác để cố gắng giải phóng đủ bộ nhớ. Nếu vẫn không đủ bộ nhớ để đáp ứng yêu cầu và heap đã đạt đến kích thước tối đa, điều đó OutOfMemoryErrorsẽ xảy ra.
David Conrad

2
Khi tôi đang sử dụng khung ForkJoin, máy tính của tôi gặp sự cố vì nó chiếm quá nhiều bộ nhớ. Có thể là trên OpenJDK không có giới hạn cứng trên bộ nhớ theo mặc định?
Barshe De Troyer

6
Như đã làm rõ tại java -Xmx 1G có nghĩa là 1 GB hay 2 ^ 30 B? , cách rõ ràng để thể hiện bao nhiêu bộ nhớ bạn bắt đầu thông qua -Xms256mlà "256 MiB", không phải "256 MB", vì nó đi bằng sức mạnh nhị phân thay vì sức mạnh của mười. Xem en.wikipedia.org/wiki/Binary_prefix . Ngoài ra, do một số không gian không thể sử dụng được dành riêng cho một nhóm không gian Survivor bổ sung, lượng bộ nhớ thực sự có sẵn Runtime.getRuntime().maxMemory()ít hơn giá trị được chỉ định qua -Xmx
nealmcb

1
Hướng dẫn hữu ích về các lỗi phổ biến liên quan đến kích thước heap: blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size
ctrlplusb

315

Chạy lệnh java -Xvà bạn sẽ nhận được một danh sách tất cả các -Xtùy chọn:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

Các tùy chọn -X không chuẩn và có thể thay đổi mà không cần thông báo trước.

Tôi hy vọng điều này sẽ giúp bạn hiểu Xms, Xmxcũng như nhiều thứ khác quan trọng nhất. :)


1
Đã học một lệnh mới ngày hôm nay, cảm ơn @RupeshYadav
jump_monkey

18

Bạn có thể chỉ định nó trong IDE của bạn. Ví dụ, đối với Eclipse trong Chạy cấu hìnhđối số VM . Bạn có thể nhập -Xmx800m -Xms500mnhư

Nhập mô tả hình ảnh ở đây


Trong RubyMine trên OSX, nó nằm trong menu Trợ giúp> Chỉnh sửa Tùy chọn VM tùy chỉnh.
Jon Schneider

8
Điều này không trả lời câu hỏi. Câu hỏi là về những gì họ đang làm, không phải làm thế nào để thiết lập chúng.
Thuyền trưởng Man

@Hearen Làm thế nào để sep up trong intellij ??

13

Các câu hỏi đã được giải quyết ở trên. Chỉ cần thêm một phần của các giá trị mặc định.

Theo http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

Giá trị mặc định của Xmx sẽ phụ thuộc vào nền tảng và dung lượng bộ nhớ có sẵn trong hệ thống.


8
Đối với các JVM khác (ngoài JRockit), xem bài này để xác định giá trị Xmx / XMS mặc định của JVM của bạn: stackoverflow.com/questions/4667483/...
Ogre Psalm33

3

-Xms kích thước heap ban đầu cho khởi động, tuy nhiên, trong quá trình làm việc, kích thước heap có thể nhỏ hơn -Xms do không hoạt động hoặc lặp lại của người dùng. Đây không phải là một kích thước heap yêu cầu tối thiểu.

-Xmx kích thước heap tối đa

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.