gc.log是否异步写入?将gc.log放在NFS挂载上是否安全?

4

我听说将gc.log放在NFS卷上是一个糟糕的想法,因为它可能会导致垃圾回收暂停时间更长。在当前的jdk(8u25)中是否仍然存在这种情况?


1
我不明白为什么这会有所改变。将gc日志记录异步化对于大多数情况下不需要异步的性能来说是不利的。如果你真的非常想知道,那么:1)测试它或2)阅读源代码。 - Stephen C
1个回答

8

我检查了一下 - 它不是异步的,而是使用常规的fopen/fwrite。这里是来自jdk8u的相关代码:相关代码

gcLogFileStream::gcLogFileStream(const char* file_name) {
  _cur_file_num = 0;
  _bytes_written = 0L;
  _file_name = make_log_name(file_name, NULL);

  // gc log file rotation
  if (UseGCLogFileRotation && NumberOfGCLogFiles > 1) {
    char tempbuf[FILENAMEBUFLEN];
    jio_snprintf(tempbuf, sizeof(tempbuf), "%s.%d" CURRENTAPPX, _file_name, _cur_file_num);
    _file = fopen(tempbuf, "w");
  } else {
    _file = fopen(_file_name, "w");
  }
  if (_file != NULL) {
    _need_close = true;
    dump_loggc_header();
  } else {
    warning("Cannot open file %s due to %s\n", _file_name, strerror(errno));
    _need_close = false;
  }
}

void gcLogFileStream::write(const char* s, size_t len) {
  if (_file != NULL) {
    size_t count = fwrite(s, 1, len, _file);
    _bytes_written += count;
  }
  update_position(s, len);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接