Kích thước heap Java mặc định được xác định như thế nào?


421

Nếu tôi bỏ qua -Xmxntùy chọn từ dòng lệnh Java thì một giá trị mặc định sẽ được sử dụng. Theo tài liệu Java

"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"

Cài đặt cấu hình hệ thống nào ảnh hưởng đến giá trị mặc định?


1
cấu hình hệ thống có nghĩa là: a) client jvm vs server jvm b) 32bit vs 64bit. Liên kết: 1) cập nhật từ J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/ cảm 2) câu trả lời ngắn gọn: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning / cách 3) câu trả lời chi tiết: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/iêu 4) client vs server: javacodegeek.com/2011/07/jvm-options-client- vs-
server.html

2
khó khăn để hiểu từ các liên kết trên. Vì vậy, tóm tắt chúng ở đây: Kích thước heap tối đa cho Client jvm là 256mb (có một ngoại lệ, đọc từ các liên kết ở trên). Kích thước heap Maximun cho Server jvm là 32 bit là 1gb và 64 bit là 32gb (một lần nữa cũng có trường hợp ngoại lệ. Vui lòng đọc từ các liên kết). Vì vậy, 256mb hoặc 1gb hoặc 32gb
Vyshnav Ramesh Thrissur

Câu trả lời:


507

Trên Windows, bạn có thể sử dụng lệnh sau để tìm hiểu các mặc định trên hệ thống nơi các ứng dụng của bạn chạy.

java -XX: + PrintFlagsFinal -version | tìm kiếm HeapSize

Tìm kiếm các tùy chọn MaxHeapSize(cho -Xmx) và InitialHeapSizecho -Xms.

Trên hệ thống Unix / Linux, bạn có thể làm

java -XX: + PrintFlagsFinal -version | grep HeapSize

Tôi tin rằng kết quả đầu ra là bằng byte.


3
Tôi đã hy vọng một tùy chọn tốt như thế này, nhưng nó không hoạt động với tôi khi sử dụng Java 6 VM của IBM.
Matt Lavin

Tuyệt quá! Tôi có thể chơi với tất cả các tùy chọn mặc định này không? Biến ENV tương ứng cho mỗi biến là gì?
Elist

28
Trong trường hợp của tôi trên Linux, InitialHeapSize = 262803264MaxHeapSize = 4206886912khoảng 256 MB4 GB nếu tôi không nhầm. Điều này có nghĩa là mọi JVM đều khởi động như thể nó được khởi chạy với -Xms256m -Xmx4gcác tùy chọn?
Yuriy Nakonechnyy

9
Trên hệ thống Windows:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster Trên Linux của tôi -versionloại bỏ văn bản "sử dụng" dài trên stderr.
Franklin Yu

115

Đối với Java SE 5: Theo Công cụ thu gom rác [Oracle] :

kích thước đống ban đầu:

Lớn hơn 1/64 bộ nhớ vật lý của máy trên máy hoặc một số mức tối thiểu hợp lý. Trước J2SE 5.0, kích thước heap ban đầu mặc định là mức tối thiểu hợp lý, thay đổi theo nền tảng. Bạn có thể ghi đè mặc định này bằng tùy chọn dòng lệnh -Xms.

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

Nhỏ hơn 1/4 bộ nhớ vật lý hoặc 1GB. Trước J2SE 5.0, kích thước heap tối đa mặc định là 64MB. Bạn có thể ghi đè mặc định này bằng tùy chọn dòng lệnh -Xmx.

CẬP NHẬT:

Như Tom Anderson đã chỉ ra trong nhận xét của mình, phần trên dành cho các máy lớp. Từ Công thái học trong Máy ảo JavaTM 5.0 :

Trong nền tảng J2SE phiên bản 5.0, một lớp máy được gọi là máy lớp máy chủ đã được xác định là máy có

  • 2 hoặc nhiều bộ xử lý vật lý
  • 2 hoặc nhiều Gbyte bộ nhớ vật lý

ngoại trừ các nền tảng 32 bit chạy phiên bản hệ điều hành Windows. Trên tất cả các nền tảng khác, các giá trị mặc định giống như các giá trị mặc định cho phiên bản 1.4.2.

Trong phiên bản nền tảng J2SE 1.4.2 theo mặc định, các lựa chọn sau đã được thực hiện

  • kích thước đống ban đầu của 4 Mbyte
  • kích thước heap tối đa 64 Mbyte

4
Hãy cẩn thận: đó là cho các máy lớp máy chủ, không phải máy khách. Bạn cần đọc tài liệu đó kết hợp với java.sun.com/docs/hotspot/gc5.0/ergo5.html trong đó xác định các thuật ngữ đó và điều gì xảy ra với các máy lớp khách. dogbane, tôi có thể khiêm tốn đề nghị bạn chỉnh sửa câu trả lời của bạn để trích dẫn các đoạn có liên quan?
Tom Anderson

3
Đó là một mặc định thấp đến mức nực cười vào năm 2012. Rất ít ứng dụng nghiêm trọng sẽ phù hợp với 64 megabyte.
Đánh dấu E. Haase

1
Xem câu trả lời ngày 30 tháng 10 năm 2012 của Ernesto cho các máy khách sau khi cập nhật Java 6 18.
Andy Thomas

Ngoài ra, hãy nhớ rằng: "Ranh giới và phân số được đưa ra cho kích thước heap là chính xác cho J2SE 5.0. Chúng có thể khác nhau trong các bản phát hành tiếp theo khi máy tính mạnh hơn."
Lodovik

Nhân tiện, thuật toán này chỉ dành cho Parallel Garbage Collector.
Mike Argyriou

45

Java 8 mất hơn 1/64 của bộ nhớ vật lý của bạn cho bạn Xmssize (tối thiểu HeapSize) và ít hơn 1/4 của bộ nhớ vật lý của bạn cho bạn -Xmxsize (Tối đa HeapSize).

Bạn có thể kiểm tra kích thước heap Java mặc định bằng cách:

Trong Windows :

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

Trong Linux :

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

Cài đặt cấu hình hệ thống nào ảnh hưởng đến giá trị mặc định?

Bộ nhớ vật lý & phiên bản Java của máy.


5
không phải là 1/64 thay vì 1/6 sao?
Vyshnav Ramesh Thrissur

1
Yeah Xmssize (HeapSize tối thiểu / InitialHeapSize) nhiều hơn 1/64 bộ nhớ vật lý của bạn & Xmxsize (HeapSize / MaxHeapSize tối đa) ít hơn 1/4 bộ nhớ vật lý của bạn. (Ví-ex cho mac của tôi, có 16GB ram, tôi nhận được uintx InitialHeapSize: = 268.435.456 {product} uintx MaxHeapSize: = 4294967296 {product}, i, e XMS là 268 MB & Xmx kiến 4.29 GB
sjethvani

1
Vui lòng chỉnh sửa câu trả lời. Đó là 1/64, không phải 1/6.
emeraldhieu

35

Điều này đã được thay đổi trong bản cập nhật Java 6 18 .

Giả sử rằng chúng tôi có hơn 1 GB bộ nhớ vật lý (khá phổ biến hiện nay), nó luôn luôn là 1/4 bộ nhớ vật lý của bạn cho máy chủ vm.


8
Không chính xác, trang được liên kết cho biếtgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni

5
Tôi vừa kiểm tra trên một máy linux có bộ nhớ vật lý 5gb. Heap tối đa mặc định hiển thị là 1,5gb
ernesto

1
@PaoloFulgoni không, một ví dụ thực tế khác mà tôi quan sát được ngay bây giờ: 129 Gbyte của kết quả bộ nhớ vật lý trong 32 Gbyte có kích thước heap tối đa
Kirill

Xem câu trả lời của apl để biết tại sao điều này đúng: stackoverflow.com/a/13310792/32453 Xem thêm stackoverflow.com/a/56036202/32453
rogerdpack

16

Ernesto nói đúng. Theo đường dẫn anh đăng [1]:

Cập nhật cấu hình heap JVM của máy khách

Trong JVM máy khách ...

  • Kích thước heap tối đa mặc định là một nửa bộ nhớ vật lý lên tới kích thước bộ nhớ vật lý là 192 megabyte và một phần tư bộ nhớ vật lý lên tới kích thước bộ nhớ vật lý là 1 gigabyte.

    Ví dụ: nếu máy của bạn có 128 megabyte bộ nhớ vật lý, thì kích thước heap tối đa là 64 megabyte và lớn hơn hoặc bằng 1 gigabyte bộ nhớ vật lý dẫn đến kích thước heap tối đa 256 megabyte.

  • Kích thước heap tối đa không thực sự được JVM sử dụng trừ khi chương trình của bạn tạo đủ các đối tượng để yêu cầu nó. Một lượng nhỏ hơn nhiều, được gọi là kích thước heap ban đầu, được phân bổ trong quá trình khởi tạo JVM. ...

  • ...
  • Công cụ cấu hình heap của máy chủ JVM hiện tại giống như Máy khách, ngoại trừ kích thước vùng heap tối đa mặc định cho JVM 32 bit là 1 gigabyte , tương ứng với kích thước bộ nhớ vật lý là 4 gigabyte và đối với JVM 64 bit là 32 gigabyte , tương ứng đến kích thước bộ nhớ vật lý là 128 gigabyte.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html



8

Cuối cùng!

Kể từ Java 8u191, bây giờ bạn có các tùy chọn:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

có thể được sử dụng để định cỡ heap theo tỷ lệ phần trăm của RAM vật lý có thể sử dụng. (giống như RAM được cài đặt ít hơn những gì kernel sử dụng).

Xem Ghi chú phát hành cho Java8 u191 để biết thêm thông tin. Lưu ý rằng các tùy chọn được đề cập dưới tiêu đề Docker nhưng thực tế chúng áp dụng cho dù bạn đang ở trong môi trường Docker hay trong môi trường truyền thống.

Giá trị mặc định cho MaxRAMPercentage là 25%. Điều này là vô cùng bảo thủ.

Quy tắc riêng của tôi: Nếu máy chủ của bạn ít nhiều dành riêng để chạy ứng dụng java đã cho, thì bạn có thể không gặp sự cố tăng đáng kể. Nếu bạn đang dùng Linux, chỉ chạy các trình tiện ích tiêu chuẩn và đã cài đặt RAM từ đâu đó khoảng 1 Gb trở lên thì tôi sẽ không ngần ngại sử dụng 75% cho heap của JVM. Một lần nữa, hãy nhớ rằng đây là 75% RAM có sẵn , không phải RAM được cài đặt . Những gì còn lại là các quy trình đất người dùng khác có thể đang chạy trên máy chủ và các loại bộ nhớ khác mà JVM cần (ví dụ cho ngăn xếp). Tất cả cùng nhau, điều này thường sẽ phù hợp độc đáo trong 25% còn lại. Rõ ràng, với RAM được cài đặt nhiều hơn, 75% là đặt cược an toàn và an toàn hơn. (Tôi ước rằng những người JDK đã triển khai một tùy chọn trong đó bạn có thể chỉ định một cái thang)

Đặt MaxRAMPercentagetùy chọn trông như thế này:

java -XX:MaxRAMPercentage=75.0  ....

Lưu ý rằng các giá trị phần trăm này thuộc loại 'gấp đôi' và do đó bạn phải chỉ định chúng bằng dấu chấm thập phân. Bạn gặp một lỗi hơi kỳ lạ nếu bạn sử dụng "75" thay vì "75.0".


7

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

Hãy xem trang tài liệu

Kích thước heap mặc định

Trừ khi kích thước heap ban đầu và tối đa được chỉ định trên dòng lệnh, chúng được tính dựa trên dung lượng bộ nhớ trên máy.

  1. Kích thước heap mặc định ban đầu và tối đa của máy khách JVM:

    Kích thước heap tối đa mặc định là một nửa bộ nhớ vật lý lên tới kích thước bộ nhớ vật lý là 192 megabyte (MB)một phần tư bộ nhớ vật lý lên đến kích thước bộ nhớ vật lý là 1 gigabyte (GB) .

  2. Máy chủ JVM Kích thước heap ban đầu và tối đa mặc định:

    Trên các JVM 32 bit, kích thước heap tối đa mặc định có thể lên tới 1 GB nếu có bộ nhớ vật lý 4 GB trở lên . Trên các JVM 64 bit, kích thước heap tối đa mặc định có thể lên tới 32 GB nếu có bộ nhớ vật lý từ 128 GB trở lên

Cài đặt cấu hình hệ thống nào ảnh hưởng đến giá trị mặc định?

Bạn có thể chỉ định kích thước heap ban đầu và tối đa bằng cách sử dụng cờ -Xms (kích thước heap ban đầu) và -Xmx (kích thước heap tối đa). Nếu bạn biết ứng dụng của mình cần bao nhiêu heap để hoạt động tốt, bạn có thể đặt -Xms-Xmx thành cùng một giá trị


5

Các XmsXmxlà lá cờ của máy ảo Java (JVM):

  • Xms: initial and minimumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • -server chế độ: 25% bộ nhớ vật lý miễn phí,> = 8MB và <= 64MB
      • -client mode: 25% bộ nhớ vật lý miễn phí,> = 8MB và <= 16MB
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> JVM bắt đầu với cấp phát Xmsbộ nhớ kích thước
  • Xmx: maximumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75%trong tổng số bộ nhớ vật lý lên tới1GB
        • Linux/Solaris: 50%của bộ nhớ vật lý khả dụng lên đến1GB
      • >= R27.3
        • Windows X64: 75%trong tổng số bộ nhớ vật lý lên tới2GB
        • Linux/Solaris X64: 50%của bộ nhớ vật lý khả dụng lên đến2GB
        • Windows x86: 75%trong tổng số bộ nhớ vật lý lên tới1GB
        • Linux/Solaris X86: 50%của bộ nhớ vật lý khả dụng lên đến1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/ Effect:
      • -> JVM cho phép sử dụng tối đa Xmxbộ nhớ kích thước
        • khi vượt quá Xmx, sẽjava.lang.OutOfMemoryError
          • Cách khắc phục OutOfMemoryError?
            • vượt quá Xmxgiá trị
              • ví dụ: từ -Xmx4gđến-Xmx8g

Thêm chi tiết

xem tài liệu chính thức: -X Tùy chọn dòng lệnh


Đó không phải là cho JVM của JRockit sao? (trái ngược với Hotspot JVM của Oracle)
peterh

4

Một số tham số ảnh hưởng đến kích thước thế hệ. Sơ đồ sau minh họa sự khác biệt giữa không gian cam kết và không gian ảo trong heap. Khi khởi tạo máy ảo, toàn bộ không gian cho heap được dành riêng. Kích thước của không gian dành riêng có thể được chỉ định với -Xmxtùy chọn. Nếu giá trị của -Xmstham số nhỏ hơn giá trị của -Xmxtham số, không phải tất cả không gian được dành riêng sẽ được cam kết ngay lập tức cho máy ảo. Không gian không cam kết được gắn nhãn "ảo" trong hình này. Các phần khác nhau của heap (thế hệ vĩnh viễn, thế hệ được thuê và thế hệ trẻ) có thể phát triển đến giới hạn của không gian ảo khi cần thiết.

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

Theo mặc định, máy ảo tăng hoặc thu hẹp heap tại mỗi bộ sưu tập để cố gắng giữ tỷ lệ không gian trống cho các đối tượng sống ở mỗi bộ sưu tập trong một phạm vi cụ thể. Phạm vi mục tiêu này được đặt theo tỷ lệ phần trăm theo các tham số - XX:MinHeapFreeRatio=<minimum>-XX:MaxHeapFreeRatio=<maximum>, và tổng kích thước được giới hạn bên dưới -Xms<min>và bên trên -Xmx<max>.

Giá trị tham số mặc định

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

Giá trị mặc định của các tham số kích thước heap trên các hệ thống 64 bit đã được tăng lên khoảng 30%. Sự gia tăng này có nghĩa là để bù cho kích thước lớn hơn của các đối tượng trên hệ thống 64 bit.

Với các tham số này, nếu phần trăm không gian trống trong một thế hệ giảm xuống dưới 40%, thế hệ sẽ được mở rộng để duy trì 40% không gian trống, lên đến kích thước tối đa được phép của thế hệ. Tương tự, nếu không gian trống vượt quá 70%, thế hệ sẽ được ký hợp đồng sao cho chỉ 70% không gian trống, tùy thuộc vào kích thước tối thiểu của thế hệ.

Các ứng dụng máy chủ lớn thường gặp hai vấn đề với các mặc định này. Một là khởi động chậm, vì heap ban đầu nhỏ và phải thay đổi kích thước qua nhiều bộ sưu tập chính. Một vấn đề cấp bách hơn là kích thước heap tối đa mặc định là nhỏ một cách vô lý đối với hầu hết các ứng dụng máy chủ. Các quy tắc của ứng dụng máy chủ là:

  • Trừ khi bạn gặp vấn đề với tạm dừng, hãy thử cấp càng nhiều bộ nhớ càng tốt cho máy ảo. Kích thước mặc định (64MB) thường quá nhỏ.
  • Đặt -Xms và -Xmx thành cùng một giá trị sẽ tăng khả năng dự đoán bằng cách xóa quyết định định cỡ quan trọng nhất khỏi máy ảo. Tuy nhiên, máy ảo sau đó không thể bù nếu bạn đưa ra lựa chọn kém.
  • Nói chung, tăng bộ nhớ khi bạn tăng số lượng bộ xử lý, vì phân bổ có thể được song song.

    bài báo đầy đủ

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.