淺談JDK9的特性之JVM的xlog
簡介
JVM是java程序運行的基礎,JVM中各種事件比如:GC,class loading,JPMS,heap,thread等等其實都可以有日志來記錄。通過這些日志,我們可以監控JVM中的事件,並可以依次來對java應用程序進行調優。
在JDK9中引入的Xlog日志服務就是為這個目的而創建的。
通過xlog,JDK將JVM中的各種事件統一起來,以統一的形式對外輸出。通過tag參數來區分子系統,通過log level來區分事件的緊急性,通過logging output來配置輸出的地址。
xlog的使用
先看一個最簡單的xlog的使用例子:
java -Xlog -version
輸出結果:
[0.016s][info][os] Use of CLOCK_MONOTONIC is supported
[0.016s][info][os] Use of pthread_condattr_setclock is not supported
[0.016s][info][os] Relative timed-wait using pthread_cond_timedwait is associated with the default clock
[0.017s][info][os] SafePoint Polling address, bad (protected) page:0x0000000108901000, good (unprotected) page:0x0000000108902000
[0.022s][info][biasedlocking] Aligned thread 0x00007f983e008200 to 0x00007f983e008800
[0.023s][info][os,thread ] Thread attached (tid: 10499, pthread id: 123145571979264).
日志非常非常長,這裡就不全部列出來瞭。從輸出的日志我們可以看到java -verson命令中JVM執行瞭諸多的操作。
我們可以看到日志中對每一個操作都列出瞭操作花費的時間,日志級別和操作所屬的分類。
通過這些日志,我們對於JVM的運行可以有更加深入的理解。
使用java -Xlog:help命令我們看一下xlog的基本格式:
-Xlog Usage: -Xlog[:[selections][:[output][:[decorators][:output-options]]]]
where ‘selections’ are combinations of tags and levels of the form tag1[+tag2…][*][=level][,…]
NOTE: Unless wildcard (*) is specified, only log messages tagged with exactly the tags specified will be matched.
selections
selections表示的是到底需要輸出哪些信息。是以tag=level來表示的。
tag表示的是JVM中的事件或者子系統:
Available log tags:
add, age, alloc, annotation, aot, arguments, attach, barrier, biasedlocking, blocks, bot, breakpoint, bytecode, cds, census, class, classhisto, cleanup, codecache, compaction, compilation, constantpool, constraints, container, coops, cpu, cset, data, datacreation, dcmd, decoder, defaultmethods, director, dump, dynamic, ergo, event, exceptions, exit, fingerprint, free, freelist, gc, handshake, hashtables, heap, humongous, ihop, iklass, init, inlining, install, interpreter, itables, jfr, jit, jni, jvmti, liveness, load, loader, logging, malloc, mark, marking, membername, memops, metadata, metaspace, methodcomparator, mirror, mmu, module, monitorinflation, monitormismatch, nestmates, nmethod, normalize, numa, objecttagging, obsolete, oldobject, oom, oopmap, oops, oopstorage, os, pagesize, parser, patch, path, perf, periodic, phases, plab, preorder, preview, promotion, protectiondomain, ptrqueue, purge, record, redefine, ref, refine, region, reloc, remset, resolve, safepoint, sampling, scavenge, setting, smr, stackmap, stacktrace, stackwalk, start, startuptime, state, stats, streaming, stringdedup, stringtable, subclass, survivor, sweep, symboltable, system, table, task, thread, time, timer, tlab, tracking, unload, unshareable, update, verification, verify, vmmutex, vmoperation, vmthread, vtables, vtablestubs, workgang
Specifying ‘all’ instead of a tag combination matches all tag combinations
levels表示的是日志的級別:
Available log levels: off, trace, debug, info, warning, error
下面舉個例子:
java -Xlog:os,class=info -version
輸出結果:
[0.002s][info][os] Use of CLOCK_MONOTONIC is supported
[0.002s][info][os] Use of pthread_condattr_setclock is not supported
[0.002s][info][os] Relative timed-wait using pthread_cond_timedwait is associated with the default clock
[0.003s][info][os] SafePoint Polling address, bad (protected) page:0x0000000109543000, good (unprotected) page:0x0000000109544000
[0.006s][info][os] attempting shared library load of /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/lib/libjava.dylib
[0.007s][info][os] shared library load of /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/lib/libjava.dylib was successful
[0.007s][info][os] attempting shared library load of /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/lib/libzip.dylib
[0.010s][info][os] shared library load of /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/lib/libzip.dylib was successful
output
output表示將日志輸出到什麼地方。
output的可選項:
stdout/stderr file=<filename>
stdout表示標準輸出,stderr表示標準錯誤。file表示輸出到文件裡面。
舉個例子:
java -Xlog:all=debug:file=debug.log -version
decorators
decorators表示輸出哪些內容到日志中。
time (t), utctime (utc), uptime (u), timemillis ™, uptimemillis (um), timenanos (tn), uptimenanos (un), hostname (hn), pid (p), tid (ti), level (l), tags (tg)
Decorators can also be specified as ‘none’ for no decoration
看下這個例子:
java -Xlog:gc*=debug:stdout:time,uptimemillis,tid -version
輸出結果:
[2020-05-05T16:12:06.871-0800][32ms][9475] Heap region size: 1M
[2020-05-05T16:12:06.871-0800][32ms][9475] Minimum heap 8388608 Initial heap 134217728 Maximum heap 2147483648
[2020-05-05T16:12:06.872-0800][33ms][9475] Heap address: 0x0000000780000000, size: 2048 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[2020-05-05T16:12:06.872-0800][33ms][9475] ConcGCThreads: 1 offset 8
[2020-05-05T16:12:06.872-0800][33ms][9475] ParallelGCThreads: 4
以上就是淺談JDK9的特性之JVM的xlog的詳細內容,更多關於JDK9的特性之JVM的xlog的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 2020macOS Big Sur配置Java開發環境之jdk安裝過程
- postgresql 利用xlog進行熱備操作
- m1 Mac設置多jdk版本並動態切換的實現
- Postgresql中xlog生成和清理邏輯操作
- RocetMQ搭建步驟與問題解決之道