gpt4 book ai didi

java - 在 JMH 中对 ArrayList.add() 进行基准测试时出现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-05 03:35:21 24 4
gpt4 key购买 nike

我一直在尝试运行基准测试来比较 Java 中 ArrayLists 和 LinkedLists 的 add 方法有多少 ops/ms。我的基准设置如下,但我无法查明是什么导致内存不足错误。可能是设置方法中列表的初始化?

@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5, time = 5)
@Measurement(iterations = 10, time = 5)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class ListAddBenchmark {

private int NUMBER = 123;

private List<Integer> arrayList, linkedList;

@Param({"1000","100000","1000000"})
public int iterations;

@Setup(Level.Trial)
public void setup() {
arrayList = new ArrayList<>();
linkedList = new LinkedList<>();
}

@Benchmark
public boolean arrayListBenchmark() {
return arrayList.add(NUMBER);
}

@Benchmark
public boolean linkedListBenchmark() {
return linkedList.add(NUMBER);
}
}

这是我得到的输出...

# JMH version: 1.32
# VM version: JDK 11.0.11, OpenJDK 64-Bit Server VM, 11.0.11+9-Ubuntu-0ubuntu2
# VM invoker: /usr/lib/jvm/java-11-openjdk-amd64/bin/java
# VM options: -Xmx4G -Xms2G
# Blackhole mode: full + dont-inline hint
# Warmup: 5 iterations, 5 s each
# Measurement: 10 iterations, 5 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: dev.example.benchmarks.collections.lists.ListAddBenchmark.arrayListBenchmark
# Parameters: (iterations = 1000)

# Run progress: 0.00% complete, ETA 00:22:30
# Fork: 1 of 3
# Warmup Iteration 1: 22716.118 ops/ms
# Warmup Iteration 2: 16060.593 ops/ms
# Warmup Iteration 3: 16104.508 ops/ms
# Warmup Iteration 4: <failure>

java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3689)
at java.base/java.util.ArrayList.grow(ArrayList.java:238)
at java.base/java.util.ArrayList.grow(ArrayList.java:243)
at java.base/java.util.ArrayList.add(ArrayList.java:486)
at java.base/java.util.ArrayList.add(ArrayList.java:499)
at dev.example.benchmarks.collections.lists.ListAddBenchmark.arrayListBenchmark(ListAddBenchmark.java:60)
at dev.example.benchmarks.collections.lists.jmh_generated.ListAddBenchmark_arrayListBenchmark_jmhTest.arrayListBenchmark_thrpt_jmhStub(ListAddBenchmark_arrayListBenchmark_jmhTest.java:142)
at dev.example.benchmarks.collections.lists.jmh_generated.ListAddBenchmark_arrayListBenchmark_jmhTest.arrayListBenchmark_Throughput(ListAddBenchmark_arrayListBenchmark_jmhTest.java:83)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:470)
at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:453)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)

有人可以帮助我做错什么吗?

最佳答案

我已经设法通过在每次拆解迭代中手动调用 System.gc() 来遏制我的 OutOfMemoryError。感谢@majusebetter 帮助确定原因。

我的最终代码现在是这样的:

@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class ListAddBenchmark {

private int NUMBER = 123;

private List<Integer> arrayList, linkedList;

@Setup(Level.Iteration)
public void setup() {
arrayList = new ArrayList<>();
linkedList = new LinkedList<>();
}

@TearDown(Level.Iteration)
public void teardown() {
System.gc();
}

@Benchmark
public boolean arrayListBenchmark() {
return arrayList.add(NUMBER);
}

@Benchmark
public boolean linkedListBenchmark() {
return linkedList.add(NUMBER);
}
}

最终输出(没有任何内存问题)是:

Benchmark                              Mode  Cnt      Score     Error   Units
ListAddBenchmark.arrayListBenchmark thrpt 30 38587.191 ± 722.036 ops/ms
ListAddBenchmark.linkedListBenchmark thrpt 30 13955.916 ± 574.261 ops/ms

关于java - 在 JMH 中对 ArrayList.add() 进行基准测试时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69903622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com