当前位置: 首页 > 科技观察

学习JVM参数前你需要了解些什么

时间:2023-03-15 14:39:39 科技观察

学习JVM参数前你需要了解什么?P/A/S/M,其中P为傻瓜模式,程序会根据环境自动设置快门速度和光圈大小,以获得相对合适的曝光效果。A档是光圈优先,用户可以设置光圈大小,快门速度等等都交给相机程序来决定,类似于半自动模式。S档是快门优先模式,与A档类似,只是用户可以设置快门速度。最后一种模式是M模式,是纯手动模式。用户可以调节快门速度、光圈大小等,这对人的要求会很高,但很多达人往往会选择M模式来拍摄自己的作品。你可以把JVM想象成一个相机,JVM参数就是光圈大小、快门速度等参数。这些参数会对程序的运行产生很大的影响。java程序运行在JVM上,JVM会根据环境自动设置一些JVM参数,但不能保证这些参数是最优的。有些参数基本上是在启动时设置的,运行时无法调整。为了让JVM更好的运行你的程序,还是需要对JVM的参数有一定的了解,知道这些JVM参数在哪些场景下有效,起到什么作用。例如,我们不希望类最终被卸载。是否可以在运行过程中打印一些日志,帮助我们了解JVM的运行情况,出现问题时是否可以自动为我们保存一些现场数据等等,这些都可以通过JVM参数来设置。有多少个JVM参数?相机调整无非是几个参数值。有多少个JVM参数?有1000多个。有没有惊到你,是的,有这么多。这些JVM参数大家可以去PerfMa社区看看(注:这是PerfMa社区专门分享JVM参数经验的讨论区)。当然,我们不必把每一个JVM参数都了解清楚,但是对于一些常见的,了解有助于性能调优的JVM参数还是很有必要的。JVM参数通常设置在启动java程序非常简单的地方。该命令类似于以下javaMain。我们都知道上面的Main是程序的启动类。JVM在执行的时候,会在Main类中找到函数Publicstaticvoidmain(Stringargs[],??签名如下)那么函数的参数args是怎么进来的呢?我们在启动命令的main类后面添加相关参数,参数之间用空格隔开,JVM会自动将这些参数作为args的一部分传入,比如在javaMainarg1arg2中,args数组会自动填充两个元素arg1和arg2,以便这些参数可以在您的程序中使用。我们称arg1和arg2为程序参数,但它们并不是与我们课程相关的程序参数。是JVM参数,那么JVM参数放哪呢?JVM参数放在main类之前,java命令之后,比如java-Xmx100MMainarg1arg2其中-Xmx100M其实是一个JVM参数,所以所有的JVM参数都放在这里如果不在这个位置,那么你设置的JVM参数就是无效的。如果参数不符合预期,请立即检查你的JVM参数设置的位置。当然也可能有一些其他的JVM参数由于某些原因可能与你的设置不一致。JVM参数怎么写?JVM参数怎么写?开头的“-X”可以有几种,比如-Xmx100M“-XX:”,比如-XX:+UseG1GC“-”,比如-verbose:gc其中-X和-通常转换为-XX:开头的一??个或多个参数,这只是一种简化的写法,比如-Xmx100M,在JVM中会自动转换为-XX:MaxHeapSize=100M,而-verbose:class自动转换为-XX:+TraceClassLoading-XX:+TraceClassUnloading通过Flags参数指定JVM参数文件。如果JVM参数和源码一起发布,如果只修改JVM参数,必须拉一个分支提交代码。这不是很友好。什么是最好的方法?我们可以在启动参数中设置一个参数。这个参数类似于下面的java-XX:Flags=/home/admin/flagsMainarg1arg2设置这个参数之后,我们只需要在服务的/home/admin目录下创建flags文件,同时在这个文件中指定所有的JVM参数即可,但是参数里面的写法有一些要求flags文件,参数如-X不能设置,但可以用其等价的-XX参数代替。比如-Xmx100M只能用-XX:MaxHeapSize=100M代替。同时,文件中不要有-XX:,只要key=value或者+/-key就可以了,不同的参数可以用换行或者空格隔开。例如flags文件内容如下:MaxHeapSize=8G+UseG1GC其实相当于-Xmx8G-XX:+UseG1GC加上-XX:+PrintVMOptions可以打印设置的JVM参数进行校验,比如java-XX:Flags=/home/admin/flags-XX:+PrintVMOptionsMainarg1arg2通过VMOptionsFile参数指定JVM参数文件。使用上面的Flags参数可能会很别扭,因为设置的参数和我们正常的写法不一样。如果我们的JDK版本大于1.8,JVM提供了一个更方便用户使用的参数,即VMOptionsFile来代替Flags。这也是指定一个文件,这个文件中JVM参数的写法和我们在java命令后写的JVM参数是一模一样的。java-XX:VMOptionsFile=/home/admin/flagsMainarg1arg2在flags文件中,我们可以写-Xmx8G-XX:+UseG1GC。是不是方便多了?【本文为专栏作家李嘉鹏原创文章,转载请微信公众号(你个假笨蛋,id:lovestblog)联系作者授权转载】点此查看本作者更多好文