JFR:读取 .jfr 文件时出现 OutOfMemoryError

JFR: OutOfMemoryError while reading .jfr file

我正在尝试分析我之前创建的一个大型飞行记录器文件 (1.5 GB)。执行 jfr print 命令时,该工具遇到 OutOfMemoryError:

$ jfr print --events "jdk.CPULoad" <file>

jfr print: unexpected internal error, Java heap space
java.lang.OutOfMemoryError: Java heap space
    at jdk.jfr/jdk.jfr.consumer.ParserFactory$CompositeParser.parse(ParserFactory.java:283)
    at jdk.jfr/jdk.jfr.consumer.ParserFactory$ArrayParser.parse(ParserFactory.java:268)
    at jdk.jfr/jdk.jfr.consumer.ParserFactory$CompositeParser.parse(ParserFactory.java:285)
    at jdk.jfr/jdk.jfr.consumer.ChunkParser.fillConstantPools(ChunkParser.java:141)
    at jdk.jfr/jdk.jfr.consumer.ChunkParser.<init>(ChunkParser.java:71)
    at jdk.jfr/jdk.jfr.consumer.ChunkParser.<init>(ChunkParser.java:56)
    at jdk.jfr/jdk.jfr.consumer.RecordingFile.findNext(RecordingFile.java:253)
    at jdk.jfr/jdk.jfr.consumer.RecordingFile.<init>(RecordingFile.java:108)
    at jdk.jfr/jdk.jfr.internal.tool.EventPrintWriter.print(EventPrintWriter.java:71)
    at jdk.jfr/jdk.jfr.internal.tool.Print.execute(Print.java:165)
    at jdk.jfr/jdk.jfr.internal.tool.Main.main(Main.java:84)

有没有办法增加 jfr 工具本身的堆大小 (-Xmx)?我没有在文档中找到相应的选项。感谢您的帮助:)

根据Kris的建议,有一个环境变量可以使用:JAVA_TOOL_OPTIONS

在我的例子中,以下方法起到了作用:

export JAVA_TOOL_OPTIONS="-Xmx5G"

您还可以使用 -J 前缀传递 JVM 选项,例如:

$ jfr -J-Xmx3048m print --events "jdk.CPULoad" <file> 

通常文件大小应该无关紧要。数据以块的形式出现,每个大约 10-15 MB,当一个新块开始时会释放内存,但看起来所有东西都在一个块中,可能是因为它是在很短的时间内发出的,所以 JVM 没有有机会旋转文件。

JDK 的未来版本可能允许过滤,即将所有 CPULoad 事件提取到一个文件中。 https://bugs.openjdk.java.net/browse/JDK-8269767