Skip to main content

Tracking Native Memory used by Gurobi in Java

Answered

Comments

2 comments

  • Official comment
    Simranjit Kaur
    • Gurobi Staff

    This post is more than two years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support.

  • Riley Clement
    • Gurobi Staff

    Hi Daniel,

    I use psrecord when profiling memory with Gurobi through our Python API.

    According to ChatGPT you could also use it for Gurobi & Java API.  You would need to install it in a Python environment though and pass it the java command as an arguments.

    Yes, **`psrecord`** is a good choice for tracking memory usage, including native memory, while running a Java program that uses Gurobi. `psrecord` monitors and records the memory and CPU usage of a specific process over time. It works well for capturing the entire memory footprint, which includes both the Java heap and native memory allocated by the Gurobi solver.

    ### How to Use `psrecord`

    1. **Install psrecord**:
       You can install `psrecord` using `pip` if it's not already installed:
       ```bash
       pip install psrecord
       ```

    2. **Run psrecord**:
       Start your Java process and find its process ID (`PID`). Once you have the `PID`, use `psrecord` to track the memory and CPU usage. For example:
       ```bash
       psrecord <PID> --interval 1 --plot memory_cpu_usage.png --log memory_cpu_usage.txt
       ```

       This command will:
       - Record the memory and CPU usage of the process with the specified `PID`.
       - Take samples every second (`--interval 1`).
       - Save the results to a log file (`memory_cpu_usage.txt`) and generate a plot (`memory_cpu_usage.png`).

    3. **Monitor Both Heap and Native Memory**:
       `psrecord` captures the **resident set size (RSS)**, which is the portion of memory occupied by a process in RAM. This includes:
       - Java heap memory managed by the JVM.
       - Native memory allocations performed by the Gurobi C library.

       By analyzing the log file and generated plot, you can see how the memory usage evolves over time during the optimization process.

    ### Advantages of Using `psrecord`
    - **Easy setup**: No need for invasive instrumentation in your Java or Gurobi code.
    - **Comprehensive memory monitoring**: Tracks the entire process memory, including native allocations.
    - **CPU profiling**: Provides additional insight into CPU usage alongside memory data.

    This approach is especially useful when you want a high-level overview of memory usage without delving into deeper C/C++ integrations or setting up detailed memory profilers.

    It is a ChatGPT answer though so take it with a grain of salt.

    - Riley

    0

Post is closed for comments.