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
我正在尝试分析我之前创建的一个大型飞行记录器文件 (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