2013-01-03 16 views
7

Ho avuto problemi di memoria con un server. È un'istanza micro amazon, quindi la sua memoria è molto limitata (free -m dice 603 MB). È per questo che ho iniziato con TomcatJVM Overhead Too Big

-server -Xmx290m -Xms290m -XX:MaxPermSize=65m 

Tuttavia, il processo di "java" dura circa 86% del totale della memoria, che è 518m. 518-355 = 163 MB di spese generali. Che sembra come un sacco, ed è sospettoso, soprattutto in considerazione che:

  • un'applicazione simile riceve un'altra versione JVM su un altro micro esempio non hai in testa questa grande
  • stessa seduta applicazione dà a livello locale a soli 40 MB sovraccarico. A livello locale viene eseguito in Windows 7, 64 bit.

La versione di Java sul server problematico è:

java version "1.7.0_09-icedtea" 
OpenJDK Runtime Environment (amzn-2.3.3.13.amzn1-x86_64) 
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode) 

La grande discrepanza tra il runtime locale e quello sul server mi fa escludere la possibilità che ci sono alcuni costosi oggetti off-heap (ad es. buffer di byte) nell'applicazione (e non lo utilizzo comunque). So che l'overhead della JVM varia, ma con più di 1/2 dell'heap in quanto l'overhead sembra troppo grande. Quindi quale potrebbe essere la ragione per questo? O è un modo normale di cose?

+0

Si aggiunge anche -server quando lo si esegue localmente? Che JVM hai localmente? – Sorin

+0

Oracle JDK, 7, 64-bit (non sono sul computer di casa adesso, quindi non potrò dare più dettagli per un po '). Non sono sicuro dell'opzione -server, è un buon punto. Ci proverò. – Bozho

+0

come reagisce senza alcun interruttore? i default? – epoch

risposta

2

La scelta del GC può influire sull'overhead delle dimensioni dell'heap, poiché ogni schema GC deve riservare parte della memoria per gestire l'heap. Inoltre, con una VM così piccola, potresti non beneficiare molto dell'andare a 64 bit. Un jvm a 32 bit occuperà meno heap, anche quando si utilizza CompressOOPS, che dovrebbe essere attivato per impostazione predefinita. Quindi gioca con i tuoi spazzini preferiti, scegli quello che offre il miglior mix di overhead e latenza per te.

+0

grazie per la risposta. Impostando -XX: + UseCompressedOops, e aggiungendo headless = true migliorate le cose un po '. Tuttavia, vengono utilizzati 483 MB, dove 350 sono riservati per heap + permgen. Probabilmente tweaking del GC avrà un effetto aggiuntivo, ma la discrepanza tra windows e linux jvms, sembra strana. – Bozho

+1

se si vuole essere ancora più accurata, provare questi:
-XX: + UnlockDiagnosticVMOptions -XX: + PrintFlagsFinal -XX: + LogVMOutput -XX: LogFile = jvm.log
quindi confrontare l'output di guardare per bandiere diverse tra le due versioni
Puoi provare Oracle Java su Amazon? –

+0

ottimo, grazie .. – Bozho