SpecJVM2008 常用的基准测试方法和内存溢出解决方案

一、 JVM2008有2种常用的基准测试,一种是peak,一种是base。2者的区别是,前者允许添加vm调优参数,后者不允许添加任何vm调优参数。

1.通常使用peak测试:

eg1: java -XX:PermSize=512M -XX:MaxPermSize=4g -jar SPECJVM2008.jar -ikv

eg2:java -Xms3000m -Xmx3000m -jar SPECJVM2008.jar –peak –profile props/specjvm.properties

2.运行base测试,不做任何jvm属性设置

java -jar SPECjvm2008.jar –base –profile props/specjvm.properties

二、内存溢出解决方法

之前测试过多次Java虚拟机性能,在神威平台上测试过都没问题,结果在龙芯和arm平台测试时遇到了out of memory error。
具体错误如下:
深度截图_选择区域_20190418172759
在官网上搜了以下,运行sepcjvm2008时可能出现的问题:Out of Memory Error:内存溢出。如果发生这种情况,取决于所使用的JVM及其运行的平台,特别是逻辑CPU的数量。抛出错误是因为基准测试中的实时数据量大于JVM可以容纳在堆上的数据量,实时数据量随着基准线程数的增加而增加,默认情况下,它被设置为Java运行时环境调用java.lang.Runtime.availableProcessors()返回的值,通常是硬件线程数(逻辑CPU) )在机器上。因此,这个问题更可能发生在大型机器上。

Peak运行解决方法:
通过设置或增加JVM(Java虚拟机)的最大堆大小来增加堆大小,通常使用命令行选项-Xmx完成。

Base运行解决方法:
通过减少基准线程的数量来减少实时数据量。减少基准线程数可能会导致性能下降。可以使用-bt 或者 属性specjvm.benchmark.threads来减少基准线程数。
例如:

/.run-specjvm.sh scimark.fft.large -bt 2

运行成功之后,再执行全面测试,并指定scimark.fft.large的线程为2:

java -jar SPECjvm2008.jar -Dspecjvm.benchmark.threads.scimark.fft.large=2

然而单独运行指定2线程测试通过,但是全部执行时,还是会报错。。。。(ㄒoㄒ) 这个问题仍然没有解决。
参考:http://www.spec.org/jvm2008/docs/KnownIssues.html#OutOfMemory

三、前面有提到peak测试,但是2个命令的参数看不太懂,做了个表格总结一下:

JVM按照存储数据的内容将内存分配为堆区和非堆区2个部分,鉴于Java的垃圾回收机制可以很好的处理堆区的资源,但是对于非堆区资源就束手无策。所以可以使用以下参数设置JVM属性进行设置:

类型 参数 说明
非堆区配置 -XX:PermSize 表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)。
非堆区配置 -XX:MaxPermSize 表示对非堆区分配的内存的最大上限。
堆区配置 -Xms 表示Java虚拟机堆区内存初始化内存分配大小;通常为可用内存的1/64大小。
堆区配置 -Xmx 表示Java虚拟机堆区内存可分配最大上限;通常为可用内存的1/4大小。
堆区配置 -XX:newSize 表示新生代初始内存的大小,应该小于 -Xms的值;
堆区配置 -XX:MaxnewSize 表示新生代可被分配的内存的最大上限;当然这个值应该小于 -Xmx的值;
堆区配置 -Xmn 如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize=-XX:MaxnewSize=-Xmn,需要注意的是这个参数是在JDK1.4版本以后才使用的

ps:由于java的垃圾回收器在内存使用达到-Xms值的时候才会开始回收,所以-xms和-Xmx的值不可设置一样大小。
参考:https://blog.csdn.net/kok1992/article/details/44774967

发表评论

电子邮件地址不会被公开。 必填项已用*标注