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?
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?
Câu trả lời:
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.
InitialHeapSize = 262803264và MaxHeapSize = 4206886912khoảng 256 MB và 4 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?
java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-versionloại bỏ văn bản "sử dụng" dài trên stderr.
Đố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
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.
Đ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.
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
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
Đối với IBM JVM, lệnh này là như sau:
java -verbose:sizes -version
Để biết thêm thông tin về SDK của IBM cho Java 8: http://www-01.ibm.com/support/ledgeledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appcilles/defaults.html ? lang = vi
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".
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.
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) và 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) .
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 và -Xmx thành cùng một giá trị
Các Xmsvà Xmxlà 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à <= 16MBTypical Size:
-Xms128M-Xms256M-Xms512MFunction/ Effect:
Xmsbộ nhớ kích thướcXmx: 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ới1GBLinux/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ới2GBLinux/Solaris X64: 50%của bộ nhớ vật lý khả dụng lên đến2GBWindows x86: 75%trong tổng số bộ nhớ vật lý lên tới1GBLinux/Solaris X86: 50%của bộ nhớ vật lý khả dụng lên đến1GBTypical Size:
-Xmx1g-Xmx2084M-Xmx4g-Xmx6g-Xmx8gFunction/ Effect:
Xmxbộ nhớ kích thước
Xmx, sẽjava.lang.OutOfMemoryError
OutOfMemoryError?
Xmxgiá trị
-Xmx4gđến-Xmx8gxem tài liệu chính thức: -X Tùy chọn dòng lệnh
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.
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>và -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à:
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.