我使用red hat提供的image来构建jdk8编写的应用程序。
这里是Dockerfile
From registry.access.redhat.com/ubi8/openjdk-8-runtime:latest
COPY benchmark-1.0.0.jar /benchmark.jar
EXPOSE 8080
ENV JAVA_OPTS="\
-server \
-XX:+UseShenandoahGC \
-Xms1g \
-Xmx1g \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=256m \
-verbose:gc \
-XX:+PrintGCDetails \
-XX:ConcGCThreads=2 \
-Xloggc:/home/jboss/gc.log \
-XX:+PrintGCDateStamps \
-XX:+AlwaysPreTouch"
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /benchmark.jar
个字符
然后我使用Jmeter工具进行压力测试,我设置了200个工作线程,持续时间为10分钟。
下面是应用程序代码:
public class GCController {
// Simulating constants, caches, and other objects in application services.
private static final int[] CONSTANT = new int[1024 * 1024 * 125];
@GetMapping("/allocate")
public void allocate(){
try {
// Assmuing each request cost 1M.
int[] allocate = new int[1024 * 256];
allocate[0] = 1;
allocate[2] = 2;
}catch (Exception e){
// ignore
}
}
}
型
用于测试的机器配置为2个CPU、2GB内存和4M带宽。
enter image description here如果我做测试,cpu的使用率将接近100%
实验结果表明,G1算法的性能优于Shenandoah算法。我的实验有什么问题吗?Shenandoah GC log的
G1 GC log的
1条答案
按热度按时间dluptydi1#
像ShenandoahGC和ZGC这样的低暂停收集器并不是为了超越G1GC或ParallelGC而设计的。它们被设计为具有低(或几乎为零)的JVM暂停,因此它们更适合真实的工作负载。“真实的”并不意味着快,它只是意味着整体性能更可预测。