2011-07-15 32 views
9

Tôi làm việc trên một ứng dụng Java phía máy chủ quan trọng về hiệu suất.Java gen cũ không ngừng phát triển - cần trợ giúp giải thích đầu ra Java GC

Khi hệ thống đã khởi động, tôi hy vọng không có đối tượng tồn tại lâu dài nào được tạo ra - chỉ những đối tượng có tuổi thọ ngắn (tối đa 10 giây). Do đó, tôi muốn điều chỉnh JVM sao cho Thế Hệ Cũ không đổi khi hệ thống đã khởi động.

Tôi nghĩ tôi đã thành công nhưng tôi không hiểu tại sao (xem bên dưới).

Dưới đây là các thiết lập của chúng tôi:

-Xmx3000m -Xms3000m verbose: gc -XX: + PrintGCTimeStamps -XX: + PrintGCDetails -XX: + UseConcMarkSweepGC -XX: SurvivorRatio = 5 -XX: TargetSurvivorRatio = 90 XX : MaxTenuringThreshold = 31 -XX: + PrintTenuringDistribution -XX: NewSize = 1250m -XX: MaxNewSize = 1250m

Chúng tôi đang sử dụng Java's Java 1.6.

Tôi thực sự bối rối bởi đầu ra của cờ "PrintTenuringDistribution". Tôi thấy đầu ra như thế này:

893.866: [GC 893.866: [ParNew 
Desired survivor size 168512712 bytes, new threshold 16 (max 31) 
- age 1: 13251072 bytes, 13251072 total 
- age 2: 1135456 bytes, 14386528 total 
- age 3:  59104 bytes, 14445632 total 
- age 4:  467384 bytes, 14913016 total 
- age 5:  68688 bytes, 14981704 total 
- age 6:  43336 bytes, 15025040 total 
- age 7:  41344 bytes, 15066384 total 
- age 8:  6872 bytes, 15073256 total 
- age 9:  87568 bytes, 15160824 total 
- age 10:  23840 bytes, 15184664 total 
- age 11:  99712 bytes, 15284376 total 
- age 12:  5224 bytes, 15289600 total 
- age 13:  1000 bytes, 15290600 total 
- age 14:  59056 bytes, 15349656 total 
- age 15: 65225584 bytes, 80575240 total 
: 1015468K->95478K(1097152K), 0.0268070 secs] 1387738K->467748K(2889152K), 0.0269910 secs] [Times: user=0.31 sys=0.00, real=0.03 secs] 
899.179: [GC 899.180: [ParNew 
Desired survivor size 168512712 bytes, new threshold 16 (max 31) 
- age 1: 12438336 bytes, 12438336 total 
- age 2: 1531984 bytes, 13970320 total 
- age 3:  87920 bytes, 14058240 total 
- age 4:  58824 bytes, 14117064 total 
- age 5:  463368 bytes, 14580432 total 
- age 6:  68688 bytes, 14649120 total 
- age 7:  43336 bytes, 14692456 total 
- age 8:  40136 bytes, 14732592 total 
- age 9:  6872 bytes, 14739464 total 
- age 10:  87568 bytes, 14827032 total 
- age 11:  23840 bytes, 14850872 total 
- age 12:  99712 bytes, 14950584 total 
- age 13:  2896 bytes, 14953480 total 
- age 14:  1000 bytes, 14954480 total 
- age 15: 65282456 bytes, 80236936 total 
: 1009782K->98799K(1097152K), 0.0383370 secs] 1382052K->471069K(2889152K), 0.0385490 secs] [Times: user=0.36 sys=0.00, real=0.03 secs] 

Cho rằng tôi có rất nhiều đối tượng với tuổi = 15, và ngưỡng là 16, tôi mong chờ từng đối tượng trong một GC hoặc là (a) được thăng tiến vào Cũ Thế hệ, hoặc (b) rác thải được thu thập.

Nhưng theo JConsole, thế hệ cũ của tôi không tăng. Vì vậy, những gì đang xảy ra với tất cả các đối tượng này?

+0

Bạn nên làm một đống đống và gửi cho khách hàng để phân tích :) –

+0

Từ nhật ký, có vẻ như tuổi thọ tối đa là 31 – rohitmohta

Trả lời

1

Độ tuổi bạn có cho các đối tượng trong không gian sống sót. Khi bạn có một không gian rộng lớn, hầu hết các vật thể tạo thành không gian sống sót sẽ tương đối cũ.

+0

Cảm ơn Peter. Tôi vẫn còn bối rối. Nhìn vào GC đầu tiên có trong câu hỏi của tôi, tôi có thể thấy 65225584 byte đối tượng có độ tuổi = 15. Vào thời điểm GC lần thứ hai xảy ra, chắc chắn những điều này có tuổi = 16 vì vậy nên đã được quảng bá cho Thế hệ Cũ? –

+0

Tôi tin rằng những người sống sót chỉ bị đẩy vào thế hệ cũ khi không gian sống sót thấp. Không gian sống sót của bạn dường như là 178 MB mỗi (1250/(5 + 1 + 1)) –

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