Java Runtime.freeMemory()在添加更多对象时返回奇怪的结果
不管出于什么原因,我想看看我可以创建多少对象并用它们填充Java Runtime.freeMemory()在添加更多对象时返回奇怪的结果,java,memory-management,garbage-collection,Java,Memory Management,Garbage Collection,不管出于什么原因,我想看看我可以创建多少对象并用它们填充LinkedList。我使用Runtime.getRuntime().freemory()获得JVM中可用内存的近似值。我写道: public static void main(String[] arg) { Scanner kb = new Scanner(System.in); List<Long> mem = new LinkedList<Long>(); while (true) {
LinkedList
。我使用Runtime.getRuntime().freemory()
获得JVM中可用内存的近似值。我写道:
public static void main(String[] arg) {
Scanner kb = new Scanner(System.in);
List<Long> mem = new LinkedList<Long>();
while (true) {
System.out.println("Max memory: " + Runtime.getRuntime().maxMemory() + ". Available memory: " + Runtime.getRuntime().freeMemory() + " bytes. Press enter to use more.");
String s = kb.nextLine();
if (s.equals("m"))
for (int i = 0; i < 1000000; i++) {
mem.add(new Long(Long.MAX_VALUE));
}
}
}
可用内存波动。这是怎么发生的?GC是否正在清理其他东西(堆上还有哪些其他东西需要真正清理?),
freemory()
方法是否返回了一个远非如此的近似值?我是错过了什么还是疯了?当您消耗更多内存时,堆会增加。请注意,freemory()
报告相对于当前堆大小的使用情况,当前堆大小可能会增加。选中totalMemory()
而不是maxMemory()
。如果我没记错的话
或者你是在问分配了哪些可能被垃圾回收的资源
- 循环中分配的
随机
- 在从OS流读取、解析为字符、然后解析为行的过程中分配的对象
- 可能在调用过程中分配了一些东西来检查空闲内存本身
Random
objects@durron597在我看来很好Xmx,提交的内存可能正在增加。在JVM上插入JVisualVM(带有VisualGC插件)以获得更多信息。或者给我们你的JVM参数。我尝试了Random,也尝试了Long.MAX_值,我得到了类似的结果。更新为Long.MAX_值。我不知道堆的大小是可变的。所以JVM中的内存就像:[ALL memory[][]]
?两者都可以根据需要在最大内存范围内增长?不,这是因为当堆满时,Java会从操作系统获得更多内存,以扩展JVM内存。直到Xmx限制。您可以强制它使用Xms预先获取所有这些信息。
Max memory: 1897725952. Available memory: 127257696 bytes.
m
Max memory: 1897725952. Available memory: 108426520 bytes.
m
Max memory: 1897725952. Available memory: 139873296 bytes.
m
Max memory: 1897725952. Available memory: 210632232 bytes.
m
Max memory: 1897725952. Available memory: 137268792 bytes.
m
Max memory: 1897725952. Available memory: 239504784 bytes.
m
Max memory: 1897725952. Available memory: 169507792 bytes.
m
Max memory: 1897725952. Available memory: 259686128 bytes.
m
Max memory: 1897725952. Available memory: 189293488 bytes.
m
Max memory: 1897725952. Available memory: 387686544 bytes.