Søppelinnsamling Logger på en fil i Java
1. Oversikt
Søppelinnsamling er et under av Java-programmeringsspråket som gir oss automatisk minnestyring. Søppeloppsamling skjuler detaljene ved å måtte tildele og omfordele minne manuelt. Selv om denne mekanismen er fantastisk, fungerer den noen ganger ikke slik vi vil. I denne opplæringen vil vi utforske Java loggingsalternativer for statistikk for søppelinnsamling og oppdag hvordan omdirigere denne statistikken til en fil.
2. GC-loggingsflagg i Java 8 og tidligere
La oss først utforske JVM-flaggene knyttet til GC-logging i Java-versjoner før Java 9.
2.1. -XX: + PrintGC
De -XX: + PrintGC flagg er et alias for -verbose: gc og slår på grunnleggende GC-logging. I denne modusen skrives det ut en enkelt linje for hver ung generasjon og hver fullgenerasjonssamling. La oss nå rette oppmerksomheten mot å gi detaljert GC-informasjon.
2.2. -XX: + PrintGCDetails
Tilsvarende har vi flagget -XX: + PrintGCDetails pleide å aktiver detaljert GC-logging i stedet for -XX: + PrintGC.
Merk at utgangen fra -XX: + PrintGCDetails endres avhengig av GC-algoritmen som er i bruk.
Deretter ser vi på å kommentere loggene våre med informasjon om dato og klokkeslett.
2.3. -XX: + PrintGCDateStamps og -XX: + PrintGCTimeStamps
Vi kan legg til datoer og tidsinformasjon i GC-loggene våre ved å bruke flaggene -XX: + PrintGCDateStamps og -XX: + PrintGCTimeStamps, henholdsvis.
Først, -XX: + PrintGCDateStamps legger til dato og klokkeslett for loggoppføringen i begynnelsen av hver linje.
Sekund, -XX: PrintGCTimeStamps legger til et tidsstempel for hver linje i loggen som beskriver tiden som gikk (i sekunder) siden JVM ble startet.
2.4. -Xloggc
Endelig kommer vi til omdirigere GC-loggen til en fil. Dette flagget tar et valgfritt filnavn som et argument ved hjelp av syntaksen -Xloggc: fil og uten tilstedeværelse av et filnavn blir GC-loggen skrevet ut.
I tillegg setter dette flagget også -XX: PrintGC og -XX: PrintGCTimestamps flagg for oss. La oss se på noen eksempler:
Hvis vi vil skrive GC-loggen til standardutdata, kan vi kjøre:
java -cp $ CLASSPATH -Xloggc mypackage.MainClass
Eller for å skrive GC-loggen til en fil, vil vi kjøre:
java -cp $ CLASSPATH -Xloggc: /tmp/gc.log mypackage.MainClass
3. GC-loggflagg i Java 9 og senere
I Java 9+, -XX: PrintGC, aliaset for -verbose: gc, er avskrevet til fordel for enhetlig loggingsalternativ, -Xlog. Alle andre GC-flagg nevnt ovenfor er fortsatt gyldige i Java 9+. Dette nye loggingsalternativet lar oss angi hvilke meldinger som skal vises, angi loggnivå og omdirigere utdata.
Vi kan kjøre kommandoen nedenfor for å se alle tilgjengelige alternativer for loggnivåer, loggdekoratorer og kodesett:
java -Xlog: logging = feilsøkingsversjon
Hvis vi for eksempel vil logge alle GC-meldinger til en fil, vil vi kjøre:
java -cp $ CLASSPATH -Xlog: gc * = feilsøking: fil = / tmp / gc.log mypackage.MainClass
I tillegg kan dette nye enhetlige loggflagget repeteres, slik at du for eksempel kan logg alle GC-meldinger til både standard ut og en fil:
java -cp $ CLASSPATH -Xlog: gc * = feilsøking: stdout -Xlog: gc * = feilsøking: fil = / tmp / gc.log mypackage.MainClass
4. Konklusjon
I denne artikkelen har vi vist hvordan du logger ut søppeloppsamling i både Java 8 og Java 9+, inkludert hvordan du omdirigerer utdataene til en fil.