笔者今天根据之前学的JVM调优课程对自己的应用程序做了一下调优,但是没想到一开始就碰到坑了,就是那个java -jar指令,笔者在其中配置jvm参数的时候出了问题
目录
BUG1:Unrecognized VM option ‘NewSize512M’
笔者调优之前先用jmap -heap PID指令查看了一下整个应用程序中堆内存的使用情况,发现默认的堆内存大小太小了,只有120M,而笔者的应用经常要进行文件上传,所以大对象比较多而且这些大对象几乎都是临时对象用完后就需要销毁的对象,所以需要将年轻代(新生代)调整的大一些,然后在百度查出了这个配置-XX:NewSize,使用的时候就报错了。如下图:
报错说是无法识别该指令,后面百度了下发现没有人报这个错误,后面笔者又尝试了下,发现-XX:NewSize这个参数和-Xmn这个参数不一样,不能直接把内存大小直接写在参数后面(也就是-XX:NewSize512M),而是应该以赋值的形式设置参数值(即-XX:NewSize=512M)。不过笔者不建议用这个参数,单独使用后会出现下面的情况(老年代的空间直接被挤占了,FullGC的次数会更加频繁)
推荐使用-XX:NewRatio=1这个参数来调节整个对内存的各年龄代的空间占比。(记得要使用 -Xms -Xmx这两个参数来设定对内存的初始大小,不然默认的堆空间大小只有电脑内存的1/64,基本都需要进行扩容)
BUG2:Improperly specified VM option ‘NewRatio=0.5’
笔者在BUG1没修复之前,尝试了一下直接调整年轻代和老年代的比例来扩大年轻代的大小,但没想到还是出BUG了,笔者原本是想使用小数表示比例的,因为原来-XX:NewRatio=4表示的是年轻代和老年代的大小比是1:4,那改成0.5后两者的比例应该是2:1。可实际上这样写根本无法生效,甚至JVM都无法创建成功,如下图
之后笔者把参数值都改成了正整数就成功了,最后为了扩容又要保证JVM能创建成功,所以笔者就是能选取1(也就是1:1)这个比例了。这个BUG说明比例的参数值只能区正整数,无法使用小数。
BUG3:Unrecognized option: --server.port=7003
由于笔者之前启动了一个应用实例已经使用了一个端口号7002,所以之后的端口为了不和之前的冲突,所以使用了新的端口号7003,但是配置这个端口参数的时候出问题了,如下图:
之后发现是参数的位置放错了,–server.port=7003这个参数需要放在完整的启动指令之后,也就是java -jar XXXX.jar后面,完整的指定端口启动指令是:java -jar XXXX.jar --server.port=7003。
补充一下JVM参数的放置位置
笔者亲身尝试,只要将JVM参数放在java和XXXX.jar之间,且该参数在当前JDK版本上是有效参数,那么这些参数就能生效(无论你使用还是没有使用-server标识参数)。感觉上-jar指令和这些JVM参数是同一个等级的参数,所以JVM参数可以和-jar参数混合使用,不知道笔者理解的对不对,还希望各位看官大佬指点指点。