gpt4 book ai didi

java - 不能消耗全部内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:38 25 4
gpt4 key购买 nike

我正在尝试编写一个应该消耗特定大小内存的程序。我想知道的一个问题是,当堆中实际上有空闲空间时,我得到了 outOfMemory 异常。

代码如下:

import java.util.Vector;
import java.lang.*;

public class MemoryEater1 {
public static void main(String[] args) {
try {
long mb = Long.valueOf(args[0]);
Vector v = new Vector();
Runtime rt = Runtime.getRuntime();
while (true) {
if (v.size() > 0) {
if (((long) v.size())*100 < mb) {
System.out.println("total memory: " + rt.totalMemory()/1024/1024);
System.out.println("max memory: " + rt.maxMemory()/1024/1024);
System.out.println("free memory: " + rt.freeMemory()/1024/1024);
System.out.println("Trying to add 100 mb");
//100mb
byte b[] = new byte[104857600];
v.add(b);
}
} else {
//100mb
byte b[] = new byte[104857600];
v.add(b);
System.out.println("Added 100 mb");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

启动命令:

 java -Xmx4096m MemoryEater1 3000

输出:

total memory: 2867
max memory: 3641
free memory: 59
Trying to add 100 mb
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at MemoryEater1.main(MemoryEater1.java:18)

那么max memory和total memory相差774mb,应该够多消耗100mb了,但是还是报错,连机器资源都够了:

[user@machine ~]$ free -m
total used free shared buffers cached
Mem: 15950 3447 12502 0 210 2389
-/+ buffers/cache: 847 15102
Swap: 4031 1759218603 8941

为什么会这样?

最佳答案

我不认为这是碎片,因为您只有一个线程分配内存而不回收任何东西。

这要归咎于您的特定垃圾收集器,它们管理内存的方式不同,导致您的应用或多或少无法使用。你可以通过分析 java -XX:+PrintCommandLineFlags 的输出来找出使用的是哪个。

您可以尝试使用以不同方式管理内存的 G1。

java -Xmx4096m -XX:+UseG1GC MemoryEater1 3000

或者使用生成大小,例如-XX:NewSize 等等

有关更多信息,请阅读 VM options以及关于垃圾收集器算法的任何内容,例如[GC调优]

这里有一个简单的说明,即为不同代拆分内存如何使其不可用 (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html)。 Memory layout

关于java - 不能消耗全部内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39999682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com