2013-02-19 32 views
9

Với một cấu hình bộ nhớ java như sauJava Heap Behavior

-Xmx2048m -Xms512m 

Điều gì sẽ là hành vi của VM khi sử dụng bộ nhớ tăng qua 512M? Có một thuật toán cụ thể mà nó theo sau? I E. Nó có đi thẳng đến mức tối đa, nó có tăng gấp đôi, nó có tăng dần hay chỉ phân bổ vì nó cần bộ nhớ? Làm thế nào đắt tiền một hoạt động là nó?

Tôi đang tìm kiếm cụ thể tại Oracle/Sun JVM, phiên bản 1.6. Tôi cho rằng đây là tài liệu trên trang web của Oracle ở đâu đó, nhưng tôi đang gặp khó khăn trong việc tìm kiếm nó.

+0

Nó chắc chắn không đi thẳng đến mức tối đa. –

+0

Bạn đang xác định tối thiểu + tối đa. Nó sẽ có ít nhất 512MB nhưng với giới hạn 2048mb. – adrian

+0

Từ sự hiểu biết của tôi, giá trị bộ nhớ tối thiểu được cấp phát khi JVM khởi động - Vì vậy, khi khởi động, nó tiêu thụ 512m từ hệ điều hành máy chủ để sử dụng cho việc sử dụng riêng của nó. Những gì tôi không hiểu là khi nó cần nhiều hơn 512m, phải mất bao nhiêu, và làm thế nào để có nó? Ví dụ - JVM cần 750mb - Nó sẽ tiêu thụ 750mb chính xác, hoặc tăng lên đến 1024mb? Hoặc theo một số hành vi khác? – Ren

Trả lời

6

Đó là công việc của người thu gom rác để quyết định khi thay đổi kích thước là cần thiết, do đó, nó được xác định bởi tham số GC 'MinFreeHeapRatio'. Nếu GC cần nhiều không gian hơn, nó sẽ phát triển thành một kích thước trong đó% của heap được chỉ định bởi giá trị đó có sẵn.

Giá trị điển hình trên nền tảng hiện đại là 40, vì vậy nếu bạn khởi động ở 512MB và có ít hơn 40% miễn phí, nghĩa là bạn vượt quá ~ 308MB, nó sẽ tăng lên đến 40% miễn phí. Vì vậy, nói sau khi bộ sưu tập vẫn còn 400 MB giá trị của các đối tượng sống, heap của bạn sẽ đi lên đến ~ 667MB. (Có nó được đặt tên theo tỷ lệ nhưng hy vọng giá trị% là đối số ... tìm kiếm tôi!)

Lưu ý đây là một chút không chính xác, bộ thu gom rác là "thế hệ" và thực sự có thể thay đổi kích thước thế hệ riêng lẻ, nhưng nó cũng đã buộc tỷ lệ giữa các thế hệ kích thước và nếu các đối tượng của bạn được phân phối giữa dài sống và ngắn sống trong khoảng cách nó ước tính, nó hoạt động ra khá tốt cho mặt sau của phong bì.

Điều này áp dụng cho các mặc định trong Java 6. Nếu bạn sử dụng cấu hình bộ thu gom rác tùy chỉnh, nó có thể khác. Bạn có thể đọc về điều đó tại đây: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generation_sizing.total_heap

("chi phí" của loại hoạt động phụ thuộc vào hệ điều hành và điều gì khác đang diễn ra. Nếu hệ thống được tải xuống và hệ điều hành phải thực hiện một số thay đổi để thực hiện một khối bộ nhớ liền kề với bạn, sau đó nó có thể rất tốn kém!)

+0

Chỉ cần những gì tôi cần! Cảm ơn. – Ren

2

Sử dụng các tùy chọn -verbose:gc và/hoặc -XX:+PrintGCDetails sẽ cung cấp cho bạn nhiều chi tiết tốt hơn.

Dưới đây là một ví dụ đầu ra với các tùy chọn -verbose:gc bật:

[GC 325407K->83000K(776768K), 0.2300771 secs] 
[GC 325816K->83372K(776768K), 0.2454258 secs] 
[Full GC 267628K->83769K(776768K), 1.8479984 secs] 

Giải thích về trên lấy từ chính thức document:

Ở đây chúng ta thấy hai bộ sưu tập nhỏ theo sau là một lớn bộ sưu tập. Các con số trước và sau mũi tên (ví dụ: 325407K->83000K từ dòng đầu tiên) cho biết kích thước kết hợp của các đối tượng trực tiếp trước và sau khi thu thập rác. Sau khi các bộ sưu tập nhỏ, kích thước bao gồm một số đối tượng là rác (không còn hoạt động) nhưng không thể khôi phục lại . Các đối tượng này được chứa trong thế hệ đã được thuê, hoặc được tham chiếu từ các thế hệ đã được bảo đảm hoặc lâu dài.

Số tiếp theo trong ngoặc đơn (ví dụ: (776768K) một lần nữa từ dòng đầu tiên ) là kích thước cam kết của heap: dung lượng sử dụng cho các đối tượng java mà không đòi hỏi nhiều bộ nhớ hơn từ hoạt động hệ thống.Lưu ý rằng con số này không bao gồm một trong những người sống sót không gian, vì chỉ có một người có thể được sử dụng tại bất kỳ thời điểm cụ thể nào và cũng không bao gồm thế hệ vĩnh viễn, giữ siêu dữ liệu được sử dụng bởi máy ảo .

Mục cuối cùng trên dòng (ví dụ: 0.2300771 secs) cho biết thời gian được thực hiện để thực hiện bộ sưu tập; trong trường hợp này khoảng một phần tư giây.

Định dạng cho bộ sưu tập chính trong dòng thứ ba là tương tự.

Chạy ứng dụng theo cách này cùng với việc cập nhật kích thước heap tối thiểu và tối đa có thể cung cấp thông tin chi tiết về phân bổ đống và mẫu thu thập rác của máy ảo.

0

cần lưu ý rằng JVM khi khởi tạo hầu như dự trữ không gian địa chỉ tối đa nhưng không cấp phát bộ nhớ vật lý. Thông thường JVM sẽ phân bổ không gian vào thế hệ Cũ và Trẻ. Có không gian xen kẽ trong thế hệ trẻ. Các đối tượng mới được gọi được chứa trong thế hệ trẻ.

Khi không gian xen kẽ được lấp đầy, GC được gọi sẽ di chuyển đối tượng tham chiếu đến một trong không gian Intermidatory được gọi là Không gian sống sót trong Phân đoạn thế hệ trẻ. GC có thể theo "stop-the-world" bằng cách lưu thuật toán trạng thái của luồng hoặc một alogorithm để các tiến trình tiếp tục chạy (?).

Khi không gian Survivor lấp đầy JVM, hãy gọi một GC đầy đủ.

Các vấn đề liên quan