【发布时间】:2020-09-23 12:21:26
【问题描述】:
我想检测可用内存何时不足(例如 15% 可用)并采取一些措施。
我尝试使用 Runtime 内存指示器,但我的行为似乎不一致。
这是我的测试应用:
import java.util.*;
public class Memory
{
static final int BYTES_PER_MB = 1024*1024;
public static void main(String[] args) {
Queue<byte[]> q = new LinkedList<>();
int allocated = 0;
while (true) {
q.add(new byte[BYTES_PER_MB * 100]);
allocated += 100;
System.out.printf("Allocated 100m (total allocated=%d)%n", allocated);
printMem();
}
}
public static void printMem() {
long max = Runtime.getRuntime().maxMemory() / BYTES_PER_MB;
long total = Runtime.getRuntime().totalMemory() / BYTES_PER_MB;
long free = Runtime.getRuntime().freeMemory() / BYTES_PER_MB;
long totalFree = free+(max-total); // allocated free + memory that can be allocated
System.out.printf("MEM: max=%dm, total=%dm, free=%d, (total free=%d)%n", max, total, free, totalFree);
}
}
这是我得到的结果:
JVM | Command | Total free before OOM
--------------------------------------------------------------------------------------------------
Oracle Java 1.8.0_191-b12 64-Bit Server | java -Xmx1024m -Xms10m Memory | 309
Oracle Java 1.8.0_191-b12 64-Bit Server | java -Xmx1024m Memory | 205
Oracle Java 11.0.2+9-LTS 64-Bit Server | java -Xmx1024m -Xms10m Memory | 12
Oracle Java 11.0.2+9-LTS 64-Bit Server | java -Xmx1024m Memory" | 12
结果对 Java 11 有意义,但我不理解 Java 8 的结果。
- 为什么我无法分配内存,即使我有足够的内存? (我不认为这是一个碎片问题,因为堆主要有 100m 块 + 如果我分配 10m 块它也会失败)
- 如果我指定一个低
-Xmx,为什么我可以分配更少?它不应该只影响初始堆大小吗?
【问题讨论】:
标签: java memory-management out-of-memory