【发布时间】:2019-05-03 18:12:54
【问题描述】:
我刚刚发现有一些库可以计算 java 对象的浅层大小,所以我想我也可以用一种非常简单的方式来编写它。这是我尝试过的。
- 用一些
Xmx启动程序说A - 创建您想要计算其大小的类型的对象(比如
T)并将它们存储在一个列表中,这样 GC 就不会清理它们。 - 当我们遇到 OOM 时,让代码处理它并清空列表。
- 现在检查我们分配的
T类型对象的数量。让它成为n - 进行二分搜索找出增量,以便成功分配
n+1对象。
这是代码,我试过了
import java.util.ArrayList;
public class test {
public static void main(String[] a) {
ArrayList<Integer> l = new ArrayList<>();
int i=0;
try {
while(true) {
l.add(new Integer(1));
i++;
}
} catch(Throwable e) {
} finally {
l.clear();
System.out.println(i + "");
}
}
}
但我注意到,在每次运行中为相同的 Xmx 分配的对象数量是不同的。为什么是这样? JVM里面有什么随机的吗?
【问题讨论】:
-
分配对象的数量不是也非常依赖于其他变量的聚合,因为它们都存储在堆中吗?你有一个数组列表和 int 也占用空间。 (只是一个奇怪的想法)。此外,按照我的理解,JVM 使用操作系统分发的可用资源。如果是这种情况,则可能会有一个不断变化的堆。
-
@JoshThrasher 每次运行不应该是一个常数吗?
-
确实如此。我想知道如果你会得到明显更小的结果,你是否在后台运行了一堆东西。如果是这样,那将支持 JVM 仅分配可用资源的想法。
-
没有,我的笔记本电脑一直都有足够的可用内存 (~50%)
标签: java heap-memory