【发布时间】:2013-11-16 02:36:27
【问题描述】:
假设我有一个类进行一些繁重的处理,使用多个集合进行操作。我想要做的是确保这样的操作不会导致内存不足,甚至更好的是我想设置它可以使用多少内存的阈值。
class MyClass()
{
public void myMethod()
{
for(int i=0; i<10000000; i++)
{
// Allocate some memory, may be several collections
}
}
}
class MyClassTest
{
@Test
public void myMethod_makeSureMemoryFootprintIsNotBiggerThanMax()
{
new MyClass().myMethod();
// How do I measure amount of memory it may try to allocate?
}
}
这样做的正确方法是什么?或者这是不可能/不可行的?
【问题讨论】:
-
@Steve P.:获取整体内存使用情况不会让您知道内存用于什么。
-
是的,但我可以设置“此算法不能消耗超过 100KB 的 RAM,不应依赖于要处理的数据大小”之类的要求。想法是通过创建显式单元测试来强制执行此操作。
-
但是为什么要设置这样的要求呢?资源很便宜,Java 就是针对这一事实而设计的。在遇到实际问题之前,您不应该担心内存消耗。除此之外,即使你找到了一种测量记忆的方法,你仍然无法测量你是否正确地解释了结果,并且你创造了一个真实的工作环境来产生真实的结果。你只会得到“一个数字”,并不会真正变得更聪明。
-
@Gimby 如果一些好奇的开发人员试图测量两种方法会有什么危害——在有意义之前它是否必须在现实的工作环境中——我猜不是。通常,某些方法在任何情况下都比其他方法占用更少的内存/ CPU 或两者。这样的分析可以派上用场,至少可以得到一个粗略的想法。
-
@Gimby “资源很便宜”当您不知道解决方案的基础设施和人员预算时,这是一个相当冒昧的评论
标签: java unit-testing junit out-of-memory testng