Add MemoryInfo to ProcessInfo

This commit is contained in:
Jonatan Ivanov 2024-06-27 08:16:49 -07:00
parent 895fbd7057
commit a9fce43b8d
No known key found for this signature in database
GPG Key ID: 828AFD0254A84974
2 changed files with 84 additions and 0 deletions

View File

@ -16,6 +16,10 @@
package org.springframework.boot.info;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
/**
* Information about the process of the application.
*
@ -50,6 +54,24 @@ public class ProcessInfo {
return runtime.availableProcessors();
}
/**
* Memory information for the process. These values can provide details about the
* current memory usage and limits selected by the user or JVM ergonomics (init, max,
* committed, used for heap and non-heap). If limits not set explicitly, it might not
* be trivial to know what these values are runtime; especially in (containerized)
* environments where resource usage can be isolated (for example using control
* groups) or not necessarily trivial to discover. Other than that, these values can
* indicate if the JVM can resize the heap (stop-the-world).
* @return heap and non-heap memory information
* @since 3.4.0
* @see MemoryMXBean#getHeapMemoryUsage()
* @see MemoryMXBean#getNonHeapMemoryUsage()
* @see MemoryUsage
*/
public MemoryInfo getMemory() {
return new MemoryInfo();
}
public long getPid() {
return this.pid;
}
@ -62,4 +84,53 @@ public class ProcessInfo {
return this.owner;
}
public static class MemoryInfo {
private static final MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
private final MemoryUsageInfo heap;
private final MemoryUsageInfo nonHeap;
MemoryInfo() {
this.heap = new MemoryUsageInfo(memoryMXBean.getHeapMemoryUsage());
this.nonHeap = new MemoryUsageInfo(memoryMXBean.getNonHeapMemoryUsage());
}
public MemoryUsageInfo getHeap() {
return this.heap;
}
public MemoryUsageInfo getNonHeap() {
return this.nonHeap;
}
public static class MemoryUsageInfo {
private final MemoryUsage memoryUsage;
MemoryUsageInfo(MemoryUsage memoryUsage) {
this.memoryUsage = memoryUsage;
}
public long getInit() {
return this.memoryUsage.getInit();
}
public long getUsed() {
return this.memoryUsage.getUsed();
}
public long getCommited() {
return this.memoryUsage.getCommitted();
}
public long getMax() {
return this.memoryUsage.getMax();
}
}
}
}

View File

@ -18,6 +18,8 @@ package org.springframework.boot.info;
import org.junit.jupiter.api.Test;
import org.springframework.boot.info.ProcessInfo.MemoryInfo.MemoryUsageInfo;
import static org.assertj.core.api.Assertions.assertThat;
/**
@ -35,6 +37,17 @@ class ProcessInfoTests {
assertThat(processInfo.getPid()).isEqualTo(ProcessHandle.current().pid());
assertThat(processInfo.getParentPid())
.isEqualTo(ProcessHandle.current().parent().map(ProcessHandle::pid).orElse(null));
MemoryUsageInfo heapUsageInfo = processInfo.getMemory().getHeap();
MemoryUsageInfo nonHeapUsageInfo = processInfo.getMemory().getNonHeap();
assertThat(heapUsageInfo.getInit()).isPositive().isLessThanOrEqualTo(heapUsageInfo.getMax());
assertThat(heapUsageInfo.getUsed()).isPositive().isLessThanOrEqualTo(heapUsageInfo.getCommited());
assertThat(heapUsageInfo.getCommited()).isPositive().isLessThanOrEqualTo(heapUsageInfo.getMax());
assertThat(heapUsageInfo.getMax()).isPositive();
assertThat(nonHeapUsageInfo.getInit()).isPositive();
assertThat(nonHeapUsageInfo.getUsed()).isPositive().isLessThanOrEqualTo(heapUsageInfo.getCommited());
assertThat(nonHeapUsageInfo.getCommited()).isPositive();
assertThat(nonHeapUsageInfo.getMax()).isEqualTo(-1);
}
}