public String toPrettyString() {
    final long totalBytesAllocated = totalNativeBytesAllocated.get() + totalHeapBytesAllocated.get();
    return String.format(
      "Statistics: {\n" +
      " pages: {\n" +
      "   requested:      %s\n" +
      "   allocated:      %s (~%2.1f%% of requested)\n" +
      "   written:        %s (~%2.1f%% of allocated)\n" +
      "   reclaimed:      %s (~%2.1f%% of allocated)\n" +
      "   handed over:    %s (~%2.1f%% of allocated)\n" +
      "   request waited: %s (~%2.1f%% of requested)\n" +
      " }\n" +

      " total bytes: {\n" +
      "   requested: %s\n" +
      "   read:      %s (~%.1f%% of requested)\n" +
      "   written:   %s\n" +
      " }\n\n" +

      " average durations: {\n" +
      "   page request: %5.1f us (~%.0f MiB/s)\n" +
      "   page load:    %5.1f us (~%.0f MiB/s)\n" +
      "   page write:   %5.1f us (~%.0f MiB/s)\n" +
      " }\n\n" +

      " native memory: {\n" +
      "   allocated: %s b (~%2.1f%% of total)\n" +
      "   reclaimed: %s b (~%2.1f%% of allocated)\n" +
      "   current:   %s b\n" +
      " }\n" +

      " heap memory: {\n" +
      "   allocated: %s b (~%.1f%% of total)\n" +
      "   reclaimed: %s b (~%.1f%% of allocated)\n" +
      "   current:   %s b\n" +
      " }\n" +

      " housekeeperTurns: {done: %d, skipped: %d, total time %d ms}\n" +
      " closedStoragesReclaimed: %d\n" +
      "}",

      totalPagesRequested,
      totalPagesAllocated, (totalPagesAllocated.get() * 100.0 / totalPagesRequested.get()),
      totalPagesWritten, (totalPagesWritten.get() * 100.0 / totalPagesAllocated.get()),
      totalPagesReclaimed, (totalPagesReclaimed.get() * 100.0 / totalPagesAllocated.get()),
      totalPagesHandedOver, (totalPagesHandedOver.get() * 100.0 / totalPagesAllocated.get()),
      pageAllocationsWaited, (pageAllocationsWaited.get() * 100.0 / totalPagesRequested.get()),

      totalBytesRequested,
      totalBytesRead, (totalBytesRead.get() * 100.0 / totalBytesRequested.get()),
      totalBytesWritten,

      totalPagesRequestsNs.get() / 1000.0 / totalPagesRequested.get(),
      totalBytesRequested.get() * 1e9 / IOUtil.MiB / totalPagesRequestsNs.get(),
      totalPagesReadNs.get() / 1000.0 / totalPagesAllocated.get(),
      totalBytesRead.get() * 1e9 / IOUtil.MiB / totalPagesReadNs.get(),
      totalPagesWriteNs.get() / 1000.0 / totalPagesWritten.get(),
      totalBytesWritten.get() * 1e9 / IOUtil.MiB / totalPagesWriteNs.get(),

      totalNativeBytesAllocated, (totalNativeBytesAllocated.get() * 100.0 / totalBytesAllocated),
      totalNativeBytesReclaimed, (totalNativeBytesReclaimed.get() * 100.0 / totalNativeBytesAllocated.get()),
      nativeBytesCurrentlyUsed,

      totalHeapBytesAllocated, (totalHeapBytesAllocated.get() * 100.0 / totalBytesAllocated),
      totalHeapBytesReclaimed, (totalHeapBytesReclaimed.get() * 100.0 / totalHeapBytesAllocated.get()),
      heapBytesCurrentlyUsed,


      housekeeperTurnsDone, housekeeperTurnsSkipped, NANOSECONDS.toMillis(housekeeperTotalTimeNs),

      totalClosedStoragesReclaimed
    );
  }
public String toPrettyString()