当前位置: 首页 > 面试题库 >

Java单元测试:如何测量方法调用的内存占用

高墨一
2023-03-14
问题内容

假设我有一个可以进行大量处理的类,并使用多个集合进行操作。我要做的是确保这种操作不会导致内存不足,甚至更好,我想设置一个阈值来确定它可以使用多少内存。

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?
   }
}

什么是正确的方法?还是这不可能/不可行?


问题答案:

我可以想到几种选择:

  • 通过微基准测试(即jmh)找出您的方法需要多少内存。
  • 基于启发式估计的建筑分配策略。有几种实现类大小估计的开源解决方案,即ClassSize。一种更简单的方法可能是利用释放很少使用的对象的缓存(例如Guava的缓存)。如@EnnoShioji所述,Guava的缓存具有基于内存的驱逐策略。

您也可以编写自己的基准测试来计算内存。这个想法是为了

  1. 运行一个线程。
  2. 创建一个新的数组来存储要分配的对象。因此,在GC运行期间不会收集这些对象。
  3. System.gc()memoryBefore = runtime.totalMemory() - runtime.freeMemory()
  4. 分配您的对象。将它们放入数组
  5. System.gc()memoryAfter = runtime.totalMemory() - runtime.freeMemory()

这是我在轻量级微基准测试工具中使用的一种技术,该工具能够以字节精度测量内存分配。



 类似资料:
  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 问题内容: 我有一些应调用某些输入的方法。不幸的是,测试这些情况会导致JUnit终止!将方法调用放在新的Thread中似乎无济于事,因为终止JVM不仅终止当前线程。有什么通用的模式可以处理吗?例如,我可以用存根替换吗? [编辑]有问题的类实际上是我要在JUnit中测试的命令行工具。也许JUnit根本不是适合该工作的工具?欢迎提出补充回归测试工具的建议(最好是与JUnit和EclEmma很好地集成在

  • 在我们的ASP。Net核心应用程序,我们有许多API从服务类调用公共方法。 服务类正在实现一个接口。 每个服务方法(取决于复杂性和需求)可以调用任意数量的内部或私有或辅助方法。 虽然这些内部/私有/或辅助方法中的每一个都单独进行单元测试,但我们如何以这样一种方式测试公共服务方法,即我们不必重复已经在测试内部/私有/辅助方法中花费的代码/精力? e、 我们可以很容易地模拟接口方法,说接口方法需要这些

  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 问题内容: 我正在使用Spring-Jersey3,无法弄清楚如何使用Spring Bean对RESTFul API进行单元测试 Controller Service Interface Service Implementation ResourceRegister.java (Jersey resource register) web.xml serviceContext.xml(Applica

  • 因为save是一个void方法。 有人知道如何修复这个单元测试吗?