2013-04-30 29 views
14

Tôi đã chạy lệnh jmap -heap trên ứng dụng đang chạy Java của chúng tôi và đây là những gì tôi nhận:Chuỗi nội bộ không có trong permgen?

C: \ Program Files \ Java \ jdk1.7.0_05 \ bin> jmap -heap 2384 Gắn để xử lý ID 2384, vui lòng chờ ... Trình gỡ lỗi được đính kèm thành công. Trình biên dịch máy chủ được phát hiện.
Phiên bản JVM là 23.1-b03

sử dụng các luồng song song trong thế hệ mới.
sử dụng phân bổ đối tượng địa phương theo chủ đề.
đồng thời Mark-Sweep GC

Heap Cấu hình:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1.310.720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 134217728 (128.0MB)
MaxPermSize = 201.326.592 (192.0MB)
G1HeapRegionSize = 0 (0.0MB)

Heap Cách sử dụng:
New Generation (Eden + 1 Survivor Space):
công suất = 228.261.888 (217.6875MB)
sử dụng = 203.794.000 (194.3531036376953MB)
miễn phí = 24.467.888 (23.334396362304688MB)
89,28078260703775% sử dụng
Eden Space:
công suất = 202.964.992 (193.5625MB)
sử dụng = 198.399.360 (189.2083740234375MB)
miễn phí = 4.565.632 (4.3541259765625MB)
97,75053226913141% sử dụng
Từ Space:
công suất = 25.296.896 (24.125MB)
sử dụng = 5.394.640 (5.1447296142578125MB)
miễn phí = 19.902.256 (18.980270385742188MB)
21,325304100550518% sử dụng
Để Space:
công suất = 25.296.896 (24.125MB)
sử dụng = 0 (0.0MB)
miễn phí = 25.296.896 (24.125MB)
0,0% sử dụng
đồng thời tạo dấu ấn-quét:
công suất = 506.445.824 (482.984375MB)
sử dụng = 159.479.408 (152.09141540527344MB)
miễn phí = 346.966.416 (330.89295959472656MB)
31,489924576809226% sử dụng
Perm Generation:
công suất = 134217728 (128.0MB)
sử dụng = 72157448 (68.81470489501953MB)
miễn phí = 62060280 (59.18529510498047MB)
53.76148819923401% được sử dụng

96874 Chuỗi được thực hiện chiếm 89695496 byte.

Vì vậy, có vẻ như có khoảng 89MB chuỗi nội bộ trong 68mb của Permgen. Có các chuỗi nội bộ không được lưu trữ trong Permgen không?

+1

Tại sao bạn có thể quan tâm? Tôi nghi ngờ bạn đang cố gắng để micromanage. –

+0

@HotLicks - Bởi vì chúng tôi đang có một ngoại lệ OOM permgen và tôi đã cố gắng để loại trừ chuỗi interning. Cộng với sự tò mò của khóa học :) – Vic

Trả lời

22

Từ Java 7 release notes:

Trong JDK 7, chuỗi thực tập nội trú không còn được phân bổ trong thế hệ thường trực của đống Java, nhưng thay vì phân bổ trong phần chính của heap Java (được gọi là trẻ và cũ thế hệ), cùng với các đối tượng khác được tạo bởi ứng dụng. Thay đổi này sẽ dẫn đến nhiều dữ liệu cư trú trong heap Java chính, và ít dữ liệu hơn trong thế hệ vĩnh viễn và do đó có thể yêu cầu điều chỉnh kích thước heap. Hầu hết các ứng dụng sẽ chỉ thấy sự khác biệt tương đối nhỏ trong việc sử dụng vùng heap do sự thay đổi này, nhưng các ứng dụng lớn hơn tải nhiều lớp hoặc sử dụng nhiều phương thức String.intern() sẽ thấy sự khác biệt đáng kể hơn.

+1

Lưu ý rằng đây là một sự thay đổi trong java 7. Xem thêm câu trả lời của tôi [ở đây] (http://stackoverflow.com/a/14985144/758831) trong đó có một số liên kết hữu ích và con trỏ đến cách mọi thứ đang thay đổi một lần nữa trong java 8. – wmorrison365

+0

Cảm ơn! Vậy điều duy nhất còn lại trong permgen trong Java 7 là các trình nạp lớp? – Vic

+0

Các trình nạp lớp cùng với các lớp đã tải của chúng. Tôi không biết các thay đổi khác liên quan đến không gian PermGen từ Java 6 đến Java 7. – dcernahoschi

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