JfrStatsParser.java

net.minecraft.util.profiling.jfr.parse.JfrStatsParser

信息

  • 全限定名:net.minecraft.util.profiling.jfr.parse.JfrStatsParser
  • 类型:public class
  • 包:net.minecraft.util.profiling.jfr.parse
  • 源码路径:src/main/java/net/minecraft/util/profiling/jfr/parse/JfrStatsParser.java
  • 起始行号:L33
  • 职责:

    TODO

字段/常量

  • recordingStarted

    • 类型: Instant
    • 修饰符: private
    • 源码定位: L34
    • 说明:

      TODO

  • recordingEnded

    • 类型: Instant
    • 修饰符: private
    • 源码定位: L35
    • 说明:

      TODO

  • chunkGenStats

    • 类型: List<ChunkGenStat>
    • 修饰符: private final
    • 源码定位: L36
    • 说明:

      TODO

  • structureGenStats

    • 类型: List<StructureGenStat>
    • 修饰符: private final
    • 源码定位: L37
    • 说明:

      TODO

  • cpuLoadStat

    • 类型: List<CpuLoadStat>
    • 修饰符: private final
    • 源码定位: L38
    • 说明:

      TODO

  • receivedPackets

    • 类型: Map<PacketIdentification,JfrStatsParser.MutableCountAndSize>
    • 修饰符: private final
    • 源码定位: L39
    • 说明:

      TODO

  • sentPackets

    • 类型: Map<PacketIdentification,JfrStatsParser.MutableCountAndSize>
    • 修饰符: private final
    • 源码定位: L40
    • 说明:

      TODO

  • readChunks

    • 类型: Map<ChunkIdentification,JfrStatsParser.MutableCountAndSize>
    • 修饰符: private final
    • 源码定位: L41
    • 说明:

      TODO

  • writtenChunks

    • 类型: Map<ChunkIdentification,JfrStatsParser.MutableCountAndSize>
    • 修饰符: private final
    • 源码定位: L42
    • 说明:

      TODO

  • fileWrites

    • 类型: List<FileIOStat>
    • 修饰符: private final
    • 源码定位: L43
    • 说明:

      TODO

  • fileReads

    • 类型: List<FileIOStat>
    • 修饰符: private final
    • 源码定位: L44
    • 说明:

      TODO

  • garbageCollections

    • 类型: int
    • 修饰符: private
    • 源码定位: L45
    • 说明:

      TODO

  • gcTotalDuration

    • 类型: Duration
    • 修饰符: private
    • 源码定位: L46
    • 说明:

      TODO

  • gcHeapStats

    • 类型: List<GcHeapStat>
    • 修饰符: private final
    • 源码定位: L47
    • 说明:

      TODO

  • threadAllocationStats

    • 类型: List<ThreadAllocationStat>
    • 修饰符: private final
    • 源码定位: L48
    • 说明:

      TODO

  • fps

    • 类型: List<FpsStat>
    • 修饰符: private final
    • 源码定位: L49
    • 说明:

      TODO

  • serverTickTimes

    • 类型: List<TickTimeStat>
    • 修饰符: private final
    • 源码定位: L50
    • 说明:

      TODO

  • worldCreationDuration

    • 类型: Duration
    • 修饰符: private
    • 源码定位: L51
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.profiling.jfr.parse.JfrStatsParser.MutableCountAndSize
    • 类型: class
    • 修饰符: public static final
    • 源码定位: L193
    • 说明:

      TODO

构造器

private JfrStatsParser(Stream<RecordedEvent> events) @ L53

  • 构造器名:JfrStatsParser
  • 源码定位:L53
  • 修饰符:private

参数:

  • events: Stream

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static JfrStatsResult parse(Path path) @ L57

  • 方法名:parse
  • 源码定位:L57
  • 返回类型:JfrStatsResult
  • 修饰符:public static

参数:

  • path: Path

说明:

TODO

private JfrStatsResult results() @ L89

  • 方法名:results
  • 源码定位:L89
  • 返回类型:JfrStatsResult
  • 修饰符:private

参数:

说明:

TODO

private void capture(Stream<RecordedEvent> events) @ L112

  • 方法名:capture
  • 源码定位:L112
  • 返回类型:void
  • 修饰符:private

参数:

  • events: Stream

说明:

TODO

private void incrementPacket(RecordedEvent event, int packetSize, Map<PacketIdentification,JfrStatsParser.MutableCountAndSize> packets) @ L173

  • 方法名:incrementPacket
  • 源码定位:L173
  • 返回类型:void
  • 修饰符:private

参数:

  • event: RecordedEvent
  • packetSize: int
  • packets: Map<PacketIdentification,JfrStatsParser.MutableCountAndSize>

说明:

TODO

private void incrementChunk(RecordedEvent event, int chunkSize, Map<ChunkIdentification,JfrStatsParser.MutableCountAndSize> packets) @ L177

  • 方法名:incrementChunk
  • 源码定位:L177
  • 返回类型:void
  • 修饰符:private

参数:

  • event: RecordedEvent
  • chunkSize: int
  • packets: Map<ChunkIdentification,JfrStatsParser.MutableCountAndSize>

说明:

TODO

private void appendFileIO(RecordedEvent event, List<FileIOStat> stats, String sizeField) @ L181

  • 方法名:appendFileIO
  • 源码定位:L181
  • 返回类型:void
  • 修饰符:private

参数:

  • event: RecordedEvent
  • stats: List
  • sizeField: String

说明:

TODO

private static <T> IoSummary<T> collectIoStats(Duration recordingDuration, Map<T,JfrStatsParser.MutableCountAndSize> packetStats) @ L185

  • 方法名:collectIoStats
  • 源码定位:L185
  • 返回类型: IoSummary
  • 修饰符:private static

参数:

  • recordingDuration: Duration
  • packetStats: Map<T,JfrStatsParser.MutableCountAndSize>

说明:

TODO

代码

public class JfrStatsParser {
    private Instant recordingStarted = Instant.EPOCH;
    private Instant recordingEnded = Instant.EPOCH;
    private final List<ChunkGenStat> chunkGenStats = new ArrayList<>();
    private final List<StructureGenStat> structureGenStats = new ArrayList<>();
    private final List<CpuLoadStat> cpuLoadStat = new ArrayList<>();
    private final Map<PacketIdentification, JfrStatsParser.MutableCountAndSize> receivedPackets = new HashMap<>();
    private final Map<PacketIdentification, JfrStatsParser.MutableCountAndSize> sentPackets = new HashMap<>();
    private final Map<ChunkIdentification, JfrStatsParser.MutableCountAndSize> readChunks = new HashMap<>();
    private final Map<ChunkIdentification, JfrStatsParser.MutableCountAndSize> writtenChunks = new HashMap<>();
    private final List<FileIOStat> fileWrites = new ArrayList<>();
    private final List<FileIOStat> fileReads = new ArrayList<>();
    private int garbageCollections;
    private Duration gcTotalDuration = Duration.ZERO;
    private final List<GcHeapStat> gcHeapStats = new ArrayList<>();
    private final List<ThreadAllocationStat> threadAllocationStats = new ArrayList<>();
    private final List<FpsStat> fps = new ArrayList<>();
    private final List<TickTimeStat> serverTickTimes = new ArrayList<>();
    private @Nullable Duration worldCreationDuration = null;
 
    private JfrStatsParser(Stream<RecordedEvent> events) {
        this.capture(events);
    }
 
    public static JfrStatsResult parse(Path path) {
        try {
            JfrStatsResult var4;
            try (final RecordingFile recordingFile = new RecordingFile(path)) {
                Iterator<RecordedEvent> iterator = new Iterator<RecordedEvent>() {
                    @Override
                    public boolean hasNext() {
                        return recordingFile.hasMoreEvents();
                    }
 
                    public RecordedEvent next() {
                        if (!this.hasNext()) {
                            throw new NoSuchElementException();
                        } else {
                            try {
                                return recordingFile.readEvent();
                            } catch (IOException var2) {
                                throw new UncheckedIOException(var2);
                            }
                        }
                    }
                };
                Stream<RecordedEvent> events = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 1297), false);
                var4 = new JfrStatsParser(events).results();
            }
 
            return var4;
        } catch (IOException var7) {
            throw new UncheckedIOException(var7);
        }
    }
 
    private JfrStatsResult results() {
        Duration recordingDuration = Duration.between(this.recordingStarted, this.recordingEnded);
        return new JfrStatsResult(
            this.recordingStarted,
            this.recordingEnded,
            recordingDuration,
            this.worldCreationDuration,
            this.fps,
            this.serverTickTimes,
            this.cpuLoadStat,
            GcHeapStat.summary(recordingDuration, this.gcHeapStats, this.gcTotalDuration, this.garbageCollections),
            ThreadAllocationStat.summary(this.threadAllocationStats),
            collectIoStats(recordingDuration, this.receivedPackets),
            collectIoStats(recordingDuration, this.sentPackets),
            collectIoStats(recordingDuration, this.writtenChunks),
            collectIoStats(recordingDuration, this.readChunks),
            FileIOStat.summary(recordingDuration, this.fileWrites),
            FileIOStat.summary(recordingDuration, this.fileReads),
            this.chunkGenStats,
            this.structureGenStats
        );
    }
 
    private void capture(Stream<RecordedEvent> events) {
        events.forEach(event -> {
            if (event.getEndTime().isAfter(this.recordingEnded) || this.recordingEnded.equals(Instant.EPOCH)) {
                this.recordingEnded = event.getEndTime();
            }
 
            if (event.getStartTime().isBefore(this.recordingStarted) || this.recordingStarted.equals(Instant.EPOCH)) {
                this.recordingStarted = event.getStartTime();
            }
 
            String s0$ = event.getEventType().getName();
            switch (s0$) {
                case "minecraft.ChunkGeneration":
                    this.chunkGenStats.add(ChunkGenStat.from(event));
                    break;
                case "minecraft.StructureGeneration":
                    this.structureGenStats.add(StructureGenStat.from(event));
                    break;
                case "minecraft.LoadWorld":
                    this.worldCreationDuration = event.getDuration();
                    break;
                case "minecraft.ClientFps":
                    this.fps.add(FpsStat.from(event, "fps"));
                    break;
                case "minecraft.ServerTickTime":
                    this.serverTickTimes.add(TickTimeStat.from(event));
                    break;
                case "minecraft.PacketReceived":
                    this.incrementPacket(event, event.getInt("bytes"), this.receivedPackets);
                    break;
                case "minecraft.PacketSent":
                    this.incrementPacket(event, event.getInt("bytes"), this.sentPackets);
                    break;
                case "minecraft.ChunkRegionRead":
                    this.incrementChunk(event, event.getInt("bytes"), this.readChunks);
                    break;
                case "minecraft.ChunkRegionWrite":
                    this.incrementChunk(event, event.getInt("bytes"), this.writtenChunks);
                    break;
                case "jdk.ThreadAllocationStatistics":
                    this.threadAllocationStats.add(ThreadAllocationStat.from(event));
                    break;
                case "jdk.GCHeapSummary":
                    this.gcHeapStats.add(GcHeapStat.from(event));
                    break;
                case "jdk.CPULoad":
                    this.cpuLoadStat.add(CpuLoadStat.from(event));
                    break;
                case "jdk.FileWrite":
                    this.appendFileIO(event, this.fileWrites, "bytesWritten");
                    break;
                case "jdk.FileRead":
                    this.appendFileIO(event, this.fileReads, "bytesRead");
                    break;
                case "jdk.GarbageCollection":
                    this.garbageCollections++;
                    this.gcTotalDuration = this.gcTotalDuration.plus(event.getDuration());
            }
        });
    }
 
    private void incrementPacket(RecordedEvent event, int packetSize, Map<PacketIdentification, JfrStatsParser.MutableCountAndSize> packets) {
        packets.computeIfAbsent(PacketIdentification.from(event), ignored -> new JfrStatsParser.MutableCountAndSize()).increment(packetSize);
    }
 
    private void incrementChunk(RecordedEvent event, int chunkSize, Map<ChunkIdentification, JfrStatsParser.MutableCountAndSize> packets) {
        packets.computeIfAbsent(ChunkIdentification.from(event), ignored -> new JfrStatsParser.MutableCountAndSize()).increment(chunkSize);
    }
 
    private void appendFileIO(RecordedEvent event, List<FileIOStat> stats, String sizeField) {
        stats.add(new FileIOStat(event.getDuration(), event.getString("path"), event.getLong(sizeField)));
    }
 
    private static <T> IoSummary<T> collectIoStats(Duration recordingDuration, Map<T, JfrStatsParser.MutableCountAndSize> packetStats) {
        List<Pair<T, IoSummary.CountAndSize>> summaryStats = packetStats.entrySet()
            .stream()
            .map(e -> Pair.of(e.getKey(), e.getValue().toCountAndSize()))
            .toList();
        return new IoSummary<>(recordingDuration, summaryStats);
    }
 
    public static final class MutableCountAndSize {
        private long count;
        private long totalSize;
 
        public void increment(int bytes) {
            this.totalSize += bytes;
            this.count++;
        }
 
        public IoSummary.CountAndSize toCountAndSize() {
            return new IoSummary.CountAndSize(this.count, this.totalSize);
        }
    }
}

引用的其他类

  • JfrStatsResult

    • 引用位置: 构造调用/返回值
    • 关联成员: JfrStatsResult()
  • ChunkGenStat

    • 引用位置: 字段/方法调用
    • 关联成员: ChunkGenStat.from()
  • ChunkIdentification

    • 引用位置: 参数/字段/方法调用
    • 关联成员: ChunkIdentification.from()
  • CpuLoadStat

    • 引用位置: 字段/方法调用
    • 关联成员: CpuLoadStat.from()
  • FileIOStat

    • 引用位置: 参数/字段/方法调用/构造调用
    • 关联成员: FileIOStat(), FileIOStat.summary()
  • FpsStat

    • 引用位置: 字段/方法调用
    • 关联成员: FpsStat.from()
  • GcHeapStat

    • 引用位置: 字段/方法调用
    • 关联成员: GcHeapStat.from(), GcHeapStat.summary()
  • IoSummary

    • 引用位置: 方法调用/构造调用/返回值
    • 关联成员: CountAndSize(), IoSummary.CountAndSize()
  • PacketIdentification

    • 引用位置: 参数/字段/方法调用
    • 关联成员: PacketIdentification.from()
  • StructureGenStat

    • 引用位置: 字段/方法调用
    • 关联成员: StructureGenStat.from()
  • ThreadAllocationStat

    • 引用位置: 字段/方法调用
    • 关联成员: ThreadAllocationStat.from(), ThreadAllocationStat.summary()
  • TickTimeStat

    • 引用位置: 字段/方法调用
    • 关联成员: TickTimeStat.from()