001package daikon;
002
003import static java.nio.charset.StandardCharsets.UTF_8;
004import static java.nio.file.StandardOpenOption.APPEND;
005import static java.nio.file.StandardOpenOption.CREATE;
006
007import java.io.PrintWriter;
008import java.nio.file.Files;
009import java.nio.file.Paths;
010import org.checkerframework.checker.initialization.qual.UnknownInitialization;
011
012public class MemMonitor implements Runnable {
013
014  boolean keep_going;
015  long max_mem_usage;
016  String filename;
017
018  public MemMonitor(String filename) {
019    this.filename = filename;
020    try (PrintWriter fout = new PrintWriter(Files.newBufferedWriter(Paths.get(filename), UTF_8))) {
021
022      keep_going = true;
023      max_mem_usage = 0;
024
025      long initial_mem_load = mem_usage();
026      fout.println("Initial memory load, " + initial_mem_load);
027      fout.println(
028          "Format: pptName, peak_mem_usage, num_samples, num_static_vars, num_orig_vars,"
029              + " num_scalar_vars, num_array_vars, num_derived_scalar_vars,"
030              + " num_derived_array_vars");
031    } catch (java.io.IOException e) {
032      throw new Error("could not open " + filename, e);
033    }
034  }
035
036  private long mem_usage(@UnknownInitialization(MemMonitor.class) MemMonitor this) {
037    return (java.lang.Runtime.getRuntime().totalMemory()
038        - java.lang.Runtime.getRuntime().freeMemory());
039  }
040
041  @Override
042  public void run() {
043    while (keep_going) {
044      max_mem_usage = Math.max(max_mem_usage, mem_usage());
045    }
046  }
047
048  public void end_of_iteration(
049      String pptName,
050      int num_samples,
051      int num_static_vars,
052      int num_orig_vars,
053      int num_scalar_vars,
054      int num_array_vars,
055      int num_derived_scalar_vars,
056      int num_derived_array_vars) {
057
058    try (PrintWriter fout =
059        new PrintWriter(Files.newBufferedWriter(Paths.get(filename), UTF_8, CREATE, APPEND))) {
060
061      fout.print(pptName + ", " + max_mem_usage + ", " + num_samples + ", ");
062      fout.print(num_static_vars + ", " + num_orig_vars + ", " + num_scalar_vars + ", ");
063      fout.println(num_array_vars + ", " + num_derived_scalar_vars + ", " + num_derived_array_vars);
064
065      max_mem_usage = mem_usage();
066    } catch (java.io.IOException e) {
067      System.out.println("could not open " + filename);
068    }
069  }
070
071  public void stop() {
072    keep_going = false;
073  }
074}