Jmeter5.1基于JDK17报错java.lang.reflect.InaccessibleObjectException

JMeter版本指定为jmeter5.1.1时,使用了最新的jdk17,在window机器上,运行脚本正常,但是切换到Linux确保异常,日志如下:

 查看jmeter.log内容,可以发现详细报错为:

java.lang.ExceptionInInitializerError: null
        at com.thoughtworks.xstream.XStream.setupConverters(XStream.java:990) ~[xstream-1.4.11.jar:1.4.11]
        at com.thoughtworks.xstream.XStream.<init>(XStream.java:593) ~[xstream-1.4.11.jar:1.4.11]
        at com.thoughtworks.xstream.XStream.<init>(XStream.java:515) ~[xstream-1.4.11.jar:1.4.11]
        at com.thoughtworks.xstream.XStream.<init>(XStream.java:484) ~[xstream-1.4.11.jar:1.4.11]
        at com.thoughtworks.xstream.XStream.<init>(XStream.java:430) ~[xstream-1.4.11.jar:1.4.11]
        at com.thoughtworks.xstream.XStream.<init>(XStream.java:383) ~[xstream-1.4.11.jar:1.4.11]
        at org.apache.jmeter.save.SaveService$XStreamWrapper.<init>(SaveService.java:83) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
        at org.apache.jmeter.save.SaveService$XStreamWrapper.<init>(SaveService.java:81) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
        at org.apache.jmeter.save.SaveService.<clinit>(SaveService.java:114) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
        at org.apache.jmeter.JMeter.runNonGui(JMeter.java:1004) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
        at org.apache.jmeter.JMeter.startNonGui(JMeter.java:991) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
        at org.apache.jmeter.JMeter.start(JMeter.java:563) [ApacheJMeter_core.jar:5.1.1 r1855137]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
        at org.apache.jmeter.NewDriver.main(NewDriver.java:253) [ApacheJMeter.jar:5.1.1 r1855137]
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Comparator java.util.TreeMap.comparator accessible: module java.base does not "opens java.util" to unnamed module @3d0f8e03
        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
        at java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) ~[?:?]
        at java.lang.reflect.Field.setAccessible(Field.java:172) ~[?:?]
        at com.thoughtworks.xstream.core.util.Fields.locate(Fields.java:40) ~[xstream-1.4.11.jar:1.4.11]
        at com.thoughtworks.xstream.converters.collections.TreeMapConverter.<clinit>(TreeMapConverter.java:50) ~[xstream-1.4.11.jar:1.4.11]
        ... 17 more

如果使用高版本的Jmeter版本,虽然不会报这个问题,但是性能指标却上不去,洒家也闹不明白。

直接上5.6与5.1的版本的压测对比数据

5.6

 perfmon监测服务器资源:

 

5.1

 这个时候,通过perfmon监控指标,cpu基本利用到顶了。

从上面的对比图可以看出,相同的脚本,不同版本下,TPS相差25左右,平均响应时间也有区别。 

 怀疑是引用了一个开源的工具包:hutool-all-5.8.20.jar

对比5.6和5.1的版本,发现jmeter.sh中JAVA9_OPTS有差异。

5.1的启动参数为:

JAVA9_OPTS="--add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.desktop/javax.swing.text.html=ALL-UNNAMED --add-opens java.desktop/sun.swing=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED"

5.6的启动参数为:

JAVA9_OPTS="--add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.desktop/sun.swing=ALL-UNNAMED --add-opens java.desktop/javax.swing.text.html=ALL-UNNAMED --add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED --add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED"

将5.1的参数替换为5.6的即可。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值