我有一个Java进程,我使用以下选项启动它(如此处所示:parameters for FR):
-XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder -XX:StartFlightRecording = duration = 2m,filename = myflightrecord.jfr -XX:FlightRecorderOptions = maxsize = 100k,maxage = 1m
以获得Flight Recorder信息。
我希望 maxage = 1m 只能给我一分钟的记录, maxsize = 100k 文件大小不会大于100Kb,但没有它们确实按预期工作。
我遇到的另一个问题是我希望文件每隔一段时间存储一次,假设每隔一分钟。但文件“ myflightrecord.jfr ”为空,直到达到持续时间(示例中为2分钟)。
有没有办法让飞行记录仪在持续时间结束前冲洗?
ps:我使用的Java版本是JDK1.8.0_45
答案 0 :(得分:4)
这适用于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 )具有误导性。它不是最大大小/年龄,而是JVM在轮换时删除日志文件的阈值,通常每12 MB发生一次。为了最大限度地减少开销,JVM不会在满足阈值时立即停止所有线程,这意味着数据溢出,实际上它是12-15 MB。如果系统高度饱和,它可能会更多,想想30-40 MB。
因此,将 maxsize 设置为100k将无效,您将始终获得至少12 Mb,
如果您将 maxage 设置为1分钟,您将获得的数据至少一分钟,如果它可以适合大约一个日志文件的大小,则可能更多12-15 Mb。
如果您有内存中的记录,则在记录结束时将数据从内存缓冲区复制到磁盘。这就是你的文件为空的原因。如果您希望Flight Recorder连续写入磁盘,则应设置 disk = true 。
答案 1 :(得分: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了解更多信息。您也可以检查threadbuffersize和globalbuffersize。
我知道标志的有效组合有所不同,因此文档可能不完全是最新的。
Kire Haglin可以纠正我误解事物的地方。