2

我有一个 Java 进程,并使用以下选项启动它(如此处建议:FR的参数):

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=2m,filename=myflightrecord.jfr -XX:FlightRecorderOptions=maxsize=100k,maxage=1m

为了获得飞行记录器信息。

我希望maxage=1m只会给我一分钟的记录,而maxsize=100k文件大小不会大于 100Kb,但它们都没有按预期工作。

我遇到的另一个问题是我希望每隔一段时间存储一次文件,假设每分钟一次。但是文件“ myflightrecord.jfr ”是空的,直到达到持续时间(示例中为 2 分钟)。

有没有办法让飞行记录器在持续时间结束之前刷新?

ps:我使用的Java版本是JDK1.8.0_45

4

2 回答 2

5

这适用于 JDK 7 和 JDK 8 (Hotspot),以及 JDK 5 和 6 (JRockit)。

首先,maxsizemaxage仅在您有基于磁盘的记录时才有效,因为参数控制要在磁盘上保留多少数据。

如果您有内存记录(defaultrecording=true,disk=false),内存缓冲区的大小取决于正在使用的线程数、每个线程允许使用的内存量、全局缓冲区数等.

Flight Recorder 是为具有 GB 内存和 TB 磁盘的大型服务器设计的,因此我认为 JVM 不会尊重您提供的数字,即单个事件可能大于 100 kb,但通常它们大约是50-150 字节。

其次,参数的名称(maxsizemaxage)具有误导性。这不是最大大小/年龄,而是 JVM 在轮换时删除日志文件的阈值,通常每 12 MB 发生一次。为了最小化开销,当达到阈值时,JVM 不会立即停止所有线程,这意味着数据溢出,因此实际上它是 12-15 MB。如果系统高度饱和,它可能会更多,想想 30-40 MB。

因此将maxsize设置为 100k 将不起作用,您将始终获得至少 12 Mb,

如果您将maxage设置为 1 分钟,您将获得至少一分钟的数据,如果它可以容纳大约一个日志文件的大小(12-15 Mb),可能会更长。

如果您有内存记录,则在记录结束时,数据会从内存缓冲区复制到磁盘。这就是为什么你的文件是空的。如果您希望 Flight Recorder 连续写入磁盘,则应设置disk=true

于 2015-09-18T19:54:47.097 回答
2

maxage 和 maxsize 选项仅在您进行连续录制时适用(= 未设置持续时间)。我也认为它们只是指导方针,而不是确切的限制。

如果你想把数据刷到磁盘连续记录,你可以设置disk=true,如果你想指定数据应该在哪里结束,你可以设置repository=path(我相信数据只会被刷当内存缓冲区已满时写入磁盘,我不确定是线程本地缓冲区已满还是全局缓冲区已满,请参阅此幻灯片中的幻灯片 13 以获取描述此内容的图片:http:// www.slideshare.net/marcushirt/java-mission-control-java-flight-recorder-deep-dive

有关更多信息,请参阅https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html XX:FlightRecorderOptions。您也可以检查线程缓冲区大小和全局缓冲区大小。

我知道标志的有效组合有所不同,因此文档可能不是完全最新的。

Kire Haglin可以纠正我误解的地方。

于 2015-09-16T09:55:49.173 回答