java - JMeter中需要设置多少内存(heap size)

标签 java http get jmeter out-of-memory

让我们来看一个非常简单的 jmeter 脚本,它在 HTTP 请求 (GET) 中下载一个 128MB 的文件。目的是强调被测服务器,因此没有必要将文件存储在本地或 jvm 的内存中以供将来使用。该文件应该已完全下载,因为它与服务器保持连接。

场景: 10 个或更多线程以 5 秒的间隔同时运行。假设网络带宽不受限制。

文件位置:https://storage.googleapis.com/videos12/dummy.txt

问题是 - 你会为 jmeter 的 jvm 的堆大小设置多少内存,这样你就不会出现 java OOM 错误?进行基本计算的方法是什么?

set HEAP=-Xms512m -Xmx512m --> 这个可以在jmeter.bat文件中设置。

a sample test plan in jmeter

最佳答案

  1. 快速回答:512 Mb 对于 10 个线程下载 128Mb 的文件来说太低了。将堆增加到总物理可用 RAM 的 80%。
  2. 更长的答案:阅读关于 Java Performance Tuning, Profiling, and Memory Management 的 Material ,辞掉你的测试员工作,成为 JVM 专家。
  3. 好的答案:不要问也不要猜,要测量。使用即 JVisualVM :

    • 使用 1 个虚拟用户运行测试。测量使用的堆
    • 使用 2 个虚拟用户运行测试。测量使用的堆。
    • 使用 4 个虚拟用户运行测试。测量使用的堆。
    • 进行复杂的算术计算
    • 根据结果设置 JMeter 堆

      JVM JMeter visual VM

  4. 正确答案:鉴于您丝毫不关心响应,请不要使用 HTTP 请求采样器并使用 JSR223 Sampler反而。示例代码:

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.util.EntityUtils;
    
    HttpClient client = HttpClientBuilder.create().build();
    HttpGet get = new HttpGet("https://storage.googleapis.com/videos12/dummy.txt");
    HttpResponse response = client.execute(get);
    SampleResult.setResponseCode(String.valueOf(response.getStatusLine().getStatusCode()));
    SampleResult.setResponseMessage(response.getStatusLine().getReasonPhrase());
    HttpEntity entity = response.getEntity();
    SampleResult.setBodySize(Math.round(entity.getContentLength()));
    EntityUtils.consume(entity);
    

    非常重要的一点:

    • 确保在“语言:下拉列表”中选择 groovy
    • 确保勾选Cache compiled script if available
    • 确保您不要忘记 EntityUtils.consume(entity); 行 - 它可以发挥所有作用

为了更好地理解“正确答案”,请参阅 HttpClient Tutorial Apache HTTP 组件 API 解释和 Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For!编写脚本最佳实践的文章。

关于java - JMeter中需要设置多少内存(heap size),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40666940/

相关文章:

java - 在 Eclipse 中导出 Java 项目时包含外部 jar

ios - Swift 中使用 NSJSONSerialization.dataWithJSONObject 和 dataUsingEncoding 组成 HTTP body 的区别

c++ - 使用 C++ recv winsocket2 保持 HTTP 事件

http - 待处理请求的 Http 状态代码应该是什么?

php - 在 ajax 查询中使用动态变量

javascript - 无法在全局变量 JS 中存储值

python-3.x - Python3 get.requests url 缺少参数

java - 为什么variable.add(index, element)会产生空错误?

java - 为什么 start-all.sh 的根本原因是 "failed to launch org.apache.spark.deploy.master.Master: JAVA_HOME is not set"?

Jhipster 上的 java.lang.NoSuchMethodError