Skip to content

Exception when using RotatingGCLogFile #442

Open
@srilakshmikanthanp

Description

@srilakshmikanthanp

I would like to extend my sincere thanks for developing and maintaining the GC Toolkit. I am encountering a DateTimeParseException when trying to use the RotatingGCLogFile class to analyze GC log files.

package com.example;

import java.io.IOException;
import java.nio.file.Path;

import com.microsoft.gctoolkit.GCToolKit;
import com.microsoft.gctoolkit.io.RotatingGCLogFile;

public class Main {
    public static void main(String[] args) throws IOException {
        var logFile = new RotatingGCLogFile(Path.of("./logs"));
        var gcToolKit = new GCToolKit();
        var jvm = gcToolKit.analyze(logFile);
    }
}

Above throws exception,

Main 
Exception in thread "main" java.time.format.DateTimeParseException: Text '[2025-05-13T14:47:20.320+0530]' could not be parsed at index 0
        at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052)
        at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1880)
        at com.microsoft.gctoolkit.time.DateTimeStamp.dateFromString(DateTimeStamp.java:52)
        at com.microsoft.gctoolkit.time.DateTimeStamp.fromGCLogLine(DateTimeStamp.java:92)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:662)
        at java.base/java.util.stream.ReferencePipeline.max(ReferencePipeline.java:698)
        at com.microsoft.gctoolkit.io.GCLogFileSegment.ageOfJVMAtLogEnd(GCLogFileSegment.java:146)
        at com.microsoft.gctoolkit.io.GCLogFileSegment.getEndTime(GCLogFileSegment.java:93)
        at com.microsoft.gctoolkit.io.RotatingLogFileMetadata.lambda$removeIneligibleSegments$6(RotatingLogFileMetadata.java:166)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
        at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at com.microsoft.gctoolkit.io.RotatingLogFileMetadata.removeIneligibleSegments(RotatingLogFileMetadata.java:167)
        at com.microsoft.gctoolkit.io.RotatingLogFileMetadata.orderSegments(RotatingLogFileMetadata.java:153)
        at com.microsoft.gctoolkit.io.RotatingLogFileMetadata.findSegments(RotatingLogFileMetadata.java:135)
        at com.microsoft.gctoolkit.io.RotatingLogFileMetadata.logFiles(RotatingLogFileMetadata.java:36)
        at com.microsoft.gctoolkit.io.RotatingGCLogFile.stream(RotatingGCLogFile.java:52)
        at com.microsoft.gctoolkit.io.GCLogFile.discoverFormat(GCLogFile.java:130)
        at com.microsoft.gctoolkit.io.GCLogFile.isUnified(GCLogFile.java:68)
        at com.microsoft.gctoolkit.io.GCLogFile.diarizer(GCLogFile.java:83)
        at com.microsoft.gctoolkit.io.GCLogFile.diary(GCLogFile.java:98)
        at com.microsoft.gctoolkit.GCToolKit.analyze(GCToolKit.java:308)
        at com.example.Main.main(Main.java:13)

Log file sample

[2025-05-13T14:47:17.266+0530][gc] Using G1
[2025-05-13T14:47:17.278+0530][gc,init] Version: 17.0.14+7-Ubuntu-124.04 (release)
[2025-05-13T14:47:17.278+0530][gc,init] CPUs: 16 total, 16 available
[2025-05-13T14:47:17.278+0530][gc,init] Memory: 15715M
[2025-05-13T14:47:17.278+0530][gc,init] Large Page Support: Disabled
[2025-05-13T14:47:17.278+0530][gc,init] NUMA Support: Disabled
[2025-05-13T14:47:17.278+0530][gc,init] Compressed Oops: Enabled (Zero based)
[2025-05-13T14:47:17.278+0530][gc,init] Heap Region Size: 4M
[2025-05-13T14:47:17.278+0530][gc,init] Heap Min Capacity: 7860M
[2025-05-13T14:47:17.278+0530][gc,init] Heap Initial Capacity: 7860M
[2025-05-13T14:47:17.278+0530][gc,init] Heap Max Capacity: 7860M
[2025-05-13T14:47:17.278+0530][gc,init] Pre-touch: Disabled
[2025-05-13T14:47:17.278+0530][gc,init] Parallel Workers: 13
[2025-05-13T14:47:17.278+0530][gc,init] Concurrent Workers: 3
[2025-05-13T14:47:17.278+0530][gc,init] Concurrent Refinement Workers: 13
[2025-05-13T14:47:17.278+0530][gc,init] Periodic GC: Disabled
[2025-05-13T14:47:17.278+0530][gc,metaspace] CDS archive(s) not mapped
[2025-05-13T14:47:17.278+0530][gc,metaspace] Compressed class space mapped at: 0x00000007c0000000-0x0000000800000000, reserved size: 1073741824
[2025-05-13T14:47:17.278+0530][gc,metaspace] Narrow klass base: 0x0000000000000000, Narrow klass shift: 3, Narrow klass range: 0x800000000
[2025-05-13T14:47:17.849+0530][gc,start    ] GC(0) Pause Young (Concurrent Start) (Metadata GC Threshold)
[2025-05-13T14:47:17.850+0530][gc,task     ] GC(0) Using 13 workers of 13 for evacuation
[2025-05-13T14:47:17.853+0530][gc,phases   ] GC(0)   Pre Evacuate Collection Set: 0.1ms

Below is the state of that string before it throws exception,

Image

is there anything else I might be missing in terms usage when working with RotatingGCLogFile, Thanks

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions