2011-07-15 12 views
9

Pracuję nad aplikacją Java po stronie serwera o krytycznym znaczeniu dla wydajności.Starsza generacja Java stale rośnie - potrzebna jest pomoc w interpretacji wyjścia Javy w języku Java

Po uruchomieniu systemu nie oczekuję tworzenia obiektów długożyciowych - tylko te z krótkim życiem (do 10 sekund). Dlatego chcę dostroić maszynę JVM tak, aby Stara Generacja była stała po uruchomieniu systemu.

Myślę, że udało mi się, ale nie rozumiem, dlaczego (patrz poniżej).

Oto nasze ustawienia:

-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

Korzystamy z Javy Oracle 1.6.

Jestem naprawdę zdezorientowany przez wyjście flagi "PrintTenuringDistribution". Widzę wyjście tak:

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] 

Biorąc pod uwagę, że mam wiele obiektów o wiek = 15, a próg wynosi 16, spodziewam każdy obiekt w GC, albo (a) awansują do starego Generacja lub (b) śmieci zebrane.

Ale według JConsole moje stare pokolenie nie wzrasta. Co się dzieje z tymi wszystkimi obiektami?

+0

Powinieneś zrobić zrzut sterty i wysłać go do klienta w celu analizy :) –

+0

Z logów wygląda na to, że maksymalny okres ważności to 31 – rohitmohta

Odpowiedz

1

Wiek, w którym przebywasz, dotyczy przedmiotów w przestrzeni ocalałego. Ponieważ masz dużą przestrzeń edenową większość obiektów, które trafią do przestrzeni ocalałej, będzie stosunkowo stara.

+0

Dzięki Peter. Wciąż jestem zdezorientowany. Patrząc na pierwsze GC zawarte w moim pytaniu, widzę 65225584 bajtów obiektów z wiekiem = 15. Do czasu, gdy stanie się drugi GC, z pewnością mają one wiek = 16 lat, więc powinno się awansować na Starą Generację? –

+0

Uważam, że osoby, które przeżyły, są wypychane tylko w starym genem, gdy przestrzeń dla ocalałych jest niska. Miejsca, w których przeżyłeś, wydają się wynosić 178 MB (1250/(5 + 1 + 1)) –