我正在尝试分析我之前创建的一个大的飞行记录器文件(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)?我在文档中没有找到相应的选项。如有任何帮助,我们将非常感谢:)
发布于 2021-10-18 13:21:05
正如克里斯所建议的,可以使用一个环境变量:JAVA_TOOL_OPTIONS
在我的例子中,以下代码做到了这一点:
export JAVA_TOOL_OPTIONS="-Xmx5G"发布于 2021-10-18 19:12:09
您还可以使用-J前缀传递JVM选项,例如:
$ jfr -J-Xmx3048m print --events "jdk.CPULoad" <file> 通常情况下,文件大小并不重要。数据以块的形式出现,每个块大约10-15MB,当新的块开始时,内存被释放,但是看起来所有的东西都在一个块中,可能是因为它是在非常短的时间内发出的,所以JVM没有机会轮换文件。
未来版本的JDK可能允许过滤,即将所有CPULoad事件提取到一个文件中。https://bugs.openjdk.java.net/browse/JDK-8269767
https://stackoverflow.com/questions/69616385
复制相似问题