Java 飞行记录器选项不起作用,文件仅在持续时间设置结束时存储
Java Flight Recorder options not working and file is stored only in the end of the duration setting
我有一个 Java 进程,我启动它(按照此处的建议:parameters for FR),选项为:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=2m,filename=myflightrecord.jfr -XX:FlightRecorderOptions=maxsize=100k,maxage=1m
为了获得飞行记录器信息。
我希望 maxage=1m 只会给我一分钟的记录,而 maxsize=100k 文件大小不会大于 100Kb,但其中 none 确实按预期工作。
我遇到的另一个问题是我希望每隔一段时间存储一次文件,假设每隔一分钟。但是文件“myflightrecord.jfr”在达到持续时间(示例中为 2 分钟)之前是空的。
有没有办法让飞行记录器在持续时间结束前刷新?
ps: 我使用的Java版本是JDK1.8.0_45
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 了解更多信息。您也可以检查 threadbuffersize 和 globalbuffersize。
我知道标志的有效组合有所不同,因此文档可能不是最新的。
Kire Haglin 可以纠正我误解的地方。
这是针对 JDK 7 和 JDK 8 (Hotspot),以及 JDK 5 和 6 (JRockit)。
首先,maxsize 和 maxage 仅在您有基于磁盘的记录时才有效,因为参数控制要保留的数据量磁盘。
如果您有内存记录(defaultrecording=true,disk=false),内存缓冲区的大小取决于正在使用的线程数,每个线程允许使用多少内存,全局缓冲区的数量等。
Flight Recorder 专为具有 GB 内存和 TB 磁盘的大型服务器而设计,因此我认为 JVM 无法遵守您提供的数量,即单个事件可能大于 100 kb,但通常它们大约为 50-150 字节。
其次,参数名称(maxsize 和 maxage)具有误导性。它不是最大值 size/age,而是 JVM 在旋转时删除日志文件的阈值,通常每 12 MB 发生一次。为了最小化开销,JVM 不会在达到阈值时立即停止所有线程,这意味着数据溢出,因此实际上它是 12-15 MB。如果系统高度饱和,它可能会更多,比如 30-40 MB。
所以将 maxsize 设置为 100k 是行不通的,你总是会得到至少 12 Mb,
如果将 maxage 设置为 1 分钟,您将获得 至少 一分钟的数据,如果可以的话,可能会更长大约一个日志文件的大小,12-15 Mb。
如果您有内存记录,记录结束时数据会从内存缓冲区复制到磁盘。这就是为什么你的文件是空的。如果你想让飞行记录器连续写入磁盘,你应该设置disk=true。
我有一个 Java 进程,我启动它(按照此处的建议:parameters for FR),选项为:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=2m,filename=myflightrecord.jfr -XX:FlightRecorderOptions=maxsize=100k,maxage=1m
为了获得飞行记录器信息。
我希望 maxage=1m 只会给我一分钟的记录,而 maxsize=100k 文件大小不会大于 100Kb,但其中 none 确实按预期工作。
我遇到的另一个问题是我希望每隔一段时间存储一次文件,假设每隔一分钟。但是文件“myflightrecord.jfr”在达到持续时间(示例中为 2 分钟)之前是空的。
有没有办法让飞行记录器在持续时间结束前刷新?
ps: 我使用的Java版本是JDK1.8.0_45
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 了解更多信息。您也可以检查 threadbuffersize 和 globalbuffersize。
我知道标志的有效组合有所不同,因此文档可能不是最新的。
Kire Haglin 可以纠正我误解的地方。
这是针对 JDK 7 和 JDK 8 (Hotspot),以及 JDK 5 和 6 (JRockit)。
首先,maxsize 和 maxage 仅在您有基于磁盘的记录时才有效,因为参数控制要保留的数据量磁盘。
如果您有内存记录(defaultrecording=true,disk=false),内存缓冲区的大小取决于正在使用的线程数,每个线程允许使用多少内存,全局缓冲区的数量等。
Flight Recorder 专为具有 GB 内存和 TB 磁盘的大型服务器而设计,因此我认为 JVM 无法遵守您提供的数量,即单个事件可能大于 100 kb,但通常它们大约为 50-150 字节。
其次,参数名称(maxsize 和 maxage)具有误导性。它不是最大值 size/age,而是 JVM 在旋转时删除日志文件的阈值,通常每 12 MB 发生一次。为了最小化开销,JVM 不会在达到阈值时立即停止所有线程,这意味着数据溢出,因此实际上它是 12-15 MB。如果系统高度饱和,它可能会更多,比如 30-40 MB。
所以将 maxsize 设置为 100k 是行不通的,你总是会得到至少 12 Mb,
如果将 maxage 设置为 1 分钟,您将获得 至少 一分钟的数据,如果可以的话,可能会更长大约一个日志文件的大小,12-15 Mb。
如果您有内存记录,记录结束时数据会从内存缓冲区复制到磁盘。这就是为什么你的文件是空的。如果你想让飞行记录器连续写入磁盘,你应该设置disk=true。