Xmxsize mặc định trong Java 8 (kích thước heap tối đa)


81

Trong tài liệu tiên tri tôi đã tìm thấy:

-Xmxsize Chỉ định kích thước tối đa (tính bằng byte) của vùng cấp phát bộ nhớ tính bằng byte ... Giá trị mặc định được chọn trong thời gian chạy dựa trên cấu hình hệ thống.

Không gì cấu hình hệ thống nghĩa là gì?


1
Có nghĩa là nếu hệ thống của bạn có 16 GB RAM, kích thước sẽ lớn hơn nếu nó có 512 MB.
JB Nizet

Cảm ơn, lớn hơn bao nhiêu?
Vitaly

Tìm "kích thước đống tối đa" ở đây
Nir Alfasi

3
>> Nhỏ hơn 1/4 bộ nhớ vật lý hoặc 1GB. Cảm ơn, @alfasin.
Vitaly

4
@Vitaly Giới hạn 1Gb dường như không phù hợp -Xmx, ít nhất là trong Java 8, bởi vì trên hệ thống 64bit Linux của tôi, với tổng bộ nhớ là 6Gb, theo mặc định, tôi có một jvm có -Xmx = 1,5Gb.
Trump 2020 - Công lý sẽ đến vào

Câu trả lời:


144

Nó thay đổi tùy theo cách triển khai và phiên bản, nhưng thông thường nó phụ thuộc vào máy ảo được sử dụng (ví dụ: máy khách hoặc máy chủ, xem -client-servercác thông số) và bộ nhớ hệ thống của bạn.

Thường thì clientgiá trị mặc định là 1/4 bộ nhớ vật lý của bạn hoặc 1GB (tùy theo giá trị nào nhỏ hơn).

Ngoài ra, các tùy chọn cấu hình Java (tham số dòng lệnh) có thể được "thuê ngoài" cho các biến môi trường bao gồm -Xmx, có thể thay đổi mặc định (nghĩa là chỉ định một mặc định mới). Cụ thể, JAVA_TOOL_OPTIONSbiến môi trường được kiểm tra bởi tất cả các công cụ Java và được sử dụng nếu tồn tại (thêm chi tiết tại đâytại đây ).

Bạn có thể chạy lệnh sau để xem các giá trị mặc định:

java -XX:+PrintFlagsFinal -version

Nó cung cấp cho bạn một danh sách loooong, -Xmxđang ở MaxHeapSize, -Xmsđang ở InitialHeapSize. Lọc đầu ra của bạn (ví dụ: |greptrên linux) hoặc lưu nó trong một tệp để bạn có thể tìm kiếm trong đó.


11
Như một bổ sung nhỏ, bạn có thể chạy java -XX:+PrintCommandLineFlagsđể in ra các kích thước heap (và thông tin khác) do JVM chọn dựa trên thông tin hệ thống hiện tại
Cristian Vat

1
@CristianVat Có, nhưng tham số là -XX:+PrintFlagsFinal, tham số bạn đề xuất không hoạt động với tôi. Thêm nó vào câu trả lời.
icza

Đúng vậy, xin lỗi -XX:+PrintFlagsFinallà lựa chọn tốt nhất vì nó sẽ hiển thị tất cả thông tin sau khi mọi thứ đã được tính đến (bao gồm các tùy chọn thủ công và công thái học). Mặc dù -XX:+PrintCommandLineFlagsdường như hoạt động trên JVM của tôi (có thể phụ thuộc vào phiên bản chính xác)
Cristian Vat

2
Đối với các hộp lớn, quy tắc ngón tay cái "1/4 RAM" này chắc chắn không phù hợp. Trên máy chủ 4-socket, 64gb mỗi socket (tức là 256gb RAM), Xmx mặc định là ~ 32gb. 32gb cũng có thể liên quan đến các hạn chế của CompressedOops ở thời điểm này.
FauxFaux

2
Điều này duy nhất in kích thước heap các dòng liên quan:java -XX:+PrintFlagsFinal -version | grep HeapSize
Trump 2020 - Công lý sẽ đến

37

Giống như bạn đã đề cập, Mặc định -Xmxsize(Kích thước HeapS tối đa) phụ thuộc vào cấu hình hệ thống của bạn.

Java8 clientchiếm Lớn hơn 1/64 bộ nhớ vật lý của bạn cho Xmssize(Kích thước HeapSize tối thiểu) và Nhỏ hơn 1/4 bộ nhớ vật lý cho -Xmxsize(Kích thước HeapSize tối đa) của bạn.

Có nghĩa là nếu bạn có bộ nhớ vật lý RAM 8GB, bạn sẽ có XmssizeLớn hơn là 8 * (1/6) và Nhỏ hơn -Xmxsizelà 8 * (1/4).

Bạn có thể Kiểm tra HeapSize mặc định của mình với

Trong Windows :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Trong Linux :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Các giá trị mặc định này cũng có thể được ghi đè thành số tiền bạn muốn.



docs.oracle.com/javase/8/docs/technotes/guides/vm/… theo liên kết này, mặc định cho tối thiểu / ban đầu là 1/64 không phải 1/6. "Lớn hơn
1/64

15

Đáng ngạc nhiên là câu hỏi này không có câu trả lời chắc chắn bằng tài liệu. Có lẽ một điểm dữ liệu khác sẽ cung cấp giá trị cho những người khác đang tìm kiếm câu trả lời. Trên hệ thống của tôi đang chạy CentOS (6.8,7.3) và Java 8 (bản dựng 1.8.0_60-b27, Máy chủ 64-Bit):

bộ nhớ mặc định là 1/4 bộ nhớ vật lý, không giới hạn 1GB.

Ngoài ra, -XX:+PrintFlagsFinalbản in ra STDERR vì vậy lệnh xác định bộ nhớ mặc định hiện tại được trình bày bởi những người khác ở trên nên được tinh chỉnh như sau:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

Thông tin sau được trả lại trên hệ thống có RAM vật lý 64GB:

uintx MaxHeapSize                                  := 16873684992      {product}

Trong hệ thống của tôi với 16 Gb RAM: 2069889024 = 2 Gb.
david.perez

Windows 7 64bit với 8 GB RAM: 32bit JVM: 256 MB, JVM 64bit: 2 GB
golimar 22/02

Cuối cùng đã tìm thấy tài liệu cho nó: stackoverflow.com/a/56036202/32453
rogerdpack

2

Trên máy ảo Ubuntu của tôi, với tổng RAM 1048 MB, java -XX:+PrintFlagsFinal -version | grep HeapSizeđược in uintx MaxHeapSize := 266338304:, khoảng 266MB và bằng 1/4 tổng số RAM của tôi.


2
Nó đang nhìn tôi như OpenJDK và Oracle có những đặc điểm khác nhau - Tôi thấy OpenJDK sử dụng 1/4 RAM như -Xmx tại mọi thời điểm (không bao giờ nhỏ hơn 1/4 và 1GB)
pogul

1

Kể từ ngày 8 tháng 5 năm 2019:

Kích thước heap JVM phụ thuộc vào cấu hình hệ thống, nghĩa là:

a) máy khách jvm và máy chủ jvm

b) 32bit so với 64bit .

Liên kết:

1) cập nhật từ J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) câu trả lời ngắn gọn: https://docs.oracle.com/ javase / 8 / docs / technotes /ists / vm / gctuning / ergonomics.html
3) câu trả lời chi tiết: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4) máy khách và máy chủ: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

Tóm tắt: (Thật khó để hiểu từ các liên kết trên. Vì vậy, tóm tắt chúng ở đây)

1) Kích thước heap tối đa mặc định cho Client jvm là 256mb (có một ngoại lệ, đọc từ các liên kết ở trên).

2) Kích thước heap tối đa mặc định cho Máy chủ jvm 32 bit là 1gb và 64 bit là 32gb (một lần nữa cũng có ngoại lệ ở đây. Vui lòng đọc điều đó từ các liên kết).

Vì vậy, kích thước heap jvm tối đa mặc định là: 256mb hoặc 1gb hoặc 32gb tùy thuộc vào máy ảo, ở trên.


1
Cuối cùng là các liên kết đến tài liệu thực giải thích những gì đang xảy ra.
rogerdpack
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.