给出的是来自任何 Java 虚拟机的详细 GC 日志(可以是任何 xml,因此不使用 java 标记):
<?xml version="1.0" ?>
<verbosegc version="versioninformation">
<af type="nursery" id="49383" timestamp="Jan 01 01:34:54 2015" intervalms="33.821">
<tenured freebytes="769243504" totalbytes="1610416128" percent="47" >
<soa freebytes="198858272" totalbytes="805208064" percent="24" />
<loa freebytes="570385232" totalbytes="805208064" percent="70" />
</tenured>
<gc></gc>
<tenured freebytes="768800232" totalbytes="1610416128" percent="47" >
<soa freebytes="198415" totalbytes="805208064" percent="24" />
<loa freebytes="570385232" totalbytes="805208064" percent="70" />
</tenured>
</af>
<af type="nursery" id="49384" timestamp="Jan 01 01:35:54 2015" intervalms="40.877">
<tenured freebytes="768800232" totalbytes="1610416128" percent="47" >
<soa freebytes="198415" totalbytes="805208064" percent="24" />
<loa freebytes="570385232" totalbytes="805208064" percent="70" />
</tenured>
<gc></gc>
<tenured freebytes="768320928" totalbytes="1610416128" percent="47" >
<soa freebytes="197935696" totalbytes="805208064" percent="24" />
<loa freebytes="570385232" totalbytes="805208064" percent="70" />
</tenured>
</af>
因此,我想创建一个新对象,该对象在每个垃圾回收周期中重复使用时间戳和使用的字节(总减去空闲)。计算工作得很好,但输出没有。这是我期望得到的:
[
{
"timestamp": "Jan 01 01:34:54 2015",
"used": 8.41172624E8
},
{
"timestamp": "Jan 01 01:35:54 2015",
"used": 8.41615896E8
},
]
我尝试了这个命令行,可悲的是它创建了一个空时间戳和一长串堆信息:
xidel --input-format=xml -e "//af/tenured[1]/(heap:={used:=(@totalbytes - @freebytes):timestamp:=@timestamp})" gc.log --output-format=json-wrapped
输出如下所示:
[
{
"timestamp": [null],
"used": [8.41172624E8, 8.41615896E8]
}
]
显然不是我所期望的。