Java虚拟机中常用vm参数的示例分析

技术Java虚拟机中常用vm参数的示例分析这篇文章主要为大家展示了“Java虚拟机中常用vm参数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java虚拟机中常用v

本文主要给大家展示“Java虚拟机中常见vm参数示例分析”,简单易懂,组织清晰,希望能帮你解决疑惑。让边肖带领大家学习和研究《Java虚拟机中常见虚拟机参数示例分析》一文。

00-1010首先我想说的是,这些参数其实我们并不陌生,在平时的开发和使用中也经常遇到,但是在平时却缺乏一个系统的总结,所以对这些参数感到陌生。所以,通过本文的总结,相信你会对这些参数比较熟悉,知道该怎么做。

在Java虚拟机的参数中,这些参数实际上可以分为三类。当然这是针对JDK1.6的,如果是针对JDK1.8的,就不这样分类了。但是,由于这两个版本的很多常用参数差别不大,本文将首先介绍JDK1.6的VM参数。

它可以分为以下三类:

标准参数(-),所有的JVM实现都必须实现这些参数的功能,并且它们是向后兼容的。

非标准参数(-X),默认JVM实现这些参数的功能,但不保证满足所有JVM实现,也不保证向后兼容。

非稳定参数(-XX),因JVM实现而异,未来随时可能取消,需谨慎使用。

虽然是这样分类的,但实际上,非标准参数和不稳定参数在实践中经常被用到,你会在后面文章的介绍中发现。

00-1010可以说是我们刚刚在Java中用到的很多参数,比如java -version、java -jar等。我们可以通过在CMD中键入java -help来获取当前版本Java的所有标准参数。

Java虚拟机中常用vm参数的示例分析

上图显示了JDK1.8的所有标准参数,下面我们将介绍一些我们将更多使用的参数。

-客户

在客户端模式下启动JVM,启动快,但运行时性能和内存管理效率不高,适合客户端程序或开发调试。

-服务器

在服务器模式下启动JVM,与客户端相反。适用于生产环境和服务器。64位JVM在服务器模式下自动启动。

-类路径或-cp

通知JVM类搜索路径。如果指定了-CLASPATH,JVM将忽略在类路径中指定的路径。路径用分号分隔。如果既没有指定-CLASPATH也没有指定类路径,JVM将从当前路径中查找类。

JVM搜索路径的顺序:

1.先搜索JVM自带的jar或zip包。

自举,搜索路径可以由系统获取。get property(' sun . boot . class . path ');

2.搜索JRE_HOME/lib/ext下的jar包。

扩展,搜索路径可以通过system . getproperty(' Java . ext . dirs ')获得;

3.搜索用户自定义目录,顺序为:当前目录(.),CLASSPATH,-cp。

搜索路径由系统获取。getproperty ('java.class.path ')。

system . out . println(system . getproperty(' sun . boot . class . path '));

system . out . println(system . getproperty(' Java . ext . dirs '));

system . out . println(system . getproperty(' Java . class . path '));Java虚拟机中常用vm参数的示例分析

就是我电脑的JVM的路径如上。

ul class=" list-paddingleft-2">

  • -DpropertyName=value

  • 定义系统的全局属性值,如配置文件地址等,如果value有空格,则需要使用双引号。

    另外用System.getProperty("hello")可以获得这些定义的属性值,在代码中也可以用System.setProperty("hello","world")的形式来定义属性。

    如键值对设置为hello=world。
    Java虚拟机中常用vm参数的示例分析

    System.out.println(System.getProperty("hello"));

    运行结果就是:
    Java虚拟机中常用vm参数的示例分析

    • -verbose

    查询GC问题最常用的命令之一,参数如下:
    -verbose:class
    输出JVM载入类的相关信息,当JVM报告说找不到类或者类冲突时可此进行诊断。
    -verbose:gc
    输出每次GC的相关情况。
    -verbose:jni
    输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

    另外,控制台输出GC信息还可以使用如下命令:

    在JVM的启动参数中加入-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime,按照参数的顺序分别输出GC的简要信息,GC的详细信息、GC的时间信息及GC造成的应用暂停的时间。

    3 非标准参数

    非标注的参数主要是关于Java内存区域的设置参数,所以在看这些参数之前,应该先查看Java内存区域的基础知识,可以查看这篇文章:深入理解Java虚拟机-Java内存区域透彻分析。

    非标准参数实在标准参数的基础上的一些扩充参数,可以输入java -X,获得当前JVM支持的非标准参数。

    Java虚拟机中常用vm参数的示例分析

    从图片中可以看出来,这些非标准的参数其实不多的,下面我们再 讲解一些比较常用的参数。

    • -Xmn

    新生代内存大小的最大值,包括E区和两个S区的总和。设置方法:-Xmn512m、-Xmn2g

    • -Xms

    初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存/64(且小于1G)。默认情况下,当堆中可用内存小于40%,堆内存会开始增加,一直增加到-Xmx的大小。

    • -Xmx

    堆的最大值,默认值是总共的物理内存/64(且小于1G),默认情况下,当堆中可用内存大于70%,堆内存会开始减少,一直减小到-Xms的大小。

    因此,为了避免这种浮动,所以在设置-Xms-Xmx参数时,一般会设置成一样的,能够提高性能。

    另外,官方默认的配置为年老代大小:年轻代大小=2:1左右,使用-XX:NewRatio可以设置年老代和年轻代之比,例如,-XX:NewRatio=4,表示年老代:年轻代=4:1

    参数实例

    设置-Xms-Xmn-Xmx参数分别为-Xms512m -Xmx512m -Xmn128m。同时设置新生代和老生代之比为1:4,E:S0:S1=8:1:1。

    **
     * @ClassName MethodTest
     * @Description vm参数设置:-Xms512m -Xmx512m -Xmn128m -XX:NewRatio=4 -XX:SurvivorRatio=8 
     * @Author 欧阳思海
     * @Date 2019/11/25 20:06
     * @Version 1.0
     **/
    public class MethodTest {
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            long i = 0;
            while (i < 1000000000) {
                System.out.println(i);
                list.add(String.valueOf(i++).intern());
            }
        }
    }

    运行之后,用VisualVM查看相关信息是否正确。

    当我们没有设置-XX:NewRatio=4 -XX:SurvivorRatio=8时,使用官方默认的情况如下:

    Java虚拟机中常用vm参数的示例分析

    上图可以看出,新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:2

    当我们设置了-XX:NewRatio=4 -XX:SurvivorRatio=8时,情况如下:

    Java虚拟机中常用vm参数的示例分析

    变成了新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:4,Eden Space:Survivor 0: Survivor 1 = 8:1:1。

    Java虚拟机中常用vm参数的示例分析

    从上图可知,堆的信息是正确的。

    • -Xss

    设置每个线程的栈内存,默认1M,一般来说是不需要改的。

    • -Xprof

    跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

    • -Xnoclassgc

    禁用类垃圾收集,关闭针对class的gc功能;因为其阻止内存回收,所以可能会导致OutOfMemoryError错误,慎用。

    • -Xincgc

    开启增量gc(默认为关闭);这有助于减少长时间GC时应用程序出现的停顿;但由于可能和应用程序并发执行,所以会降低CPU对应用的处理能力。

    • -Xloggc:file

    -verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
    若与verbose命令同时出现在命令行中,则以-Xloggc为准。

    • -Xint

    在解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,这会降低运行速度,通常低10倍或更多。

    • -Xcomp

    -Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。

    然而,很多应用在使用-Xcomp也会有一些性能损失,当然这比使用-Xint损失的少,原因是-xcomp没有让JVM启用JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义了。

    • -Xmixed

    -Xmixed是混合模式,这是JVM默认的模式,也是推荐使用的模式。将解释模式与编译模式进行混合使用,由JVM自己决定。

    4 非Stable参数

    这类参数你一看官网以为不能使用呢,官网给你的建议就是这些参数不稳定,慎用,其实这主要的原因还是因为每个公司的实现都是不一样的,所以就是导致不稳定。但是呢,在实际的使用中却是非常的多的,而且这部分的参数很重要。

    这些参数大致可以分为三类:

    • 性能参数(Performance Options):用于JVM的性能调优和内存分配控制,如初始化内存大小的设置;

    • 行为参数(Behavioral Options):用于改变JVM的基础行为,如GC的方式和算法的选择;

    • 调试参数(Debugging Options):用于监控、打印、输出等jvm参数,用于显示jvm更加详细的信息;

    下面还是先罗列一些比较常用的参数,其实,这些文章很多了,这里主要还是做一个总结,以后自己看文章的时候比较方便,如果有同行看到了文章,你可以参考参考,还是很有帮助的。

    另外,选取其中的一些参数做一些例子来解释,这样也能够更加的形象。

    注意:以下参数都是JDK1.7及以下可以使用。

    • 性能参数

    参数及其默认值 描述
    -XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
    -XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
    -XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
    -XX:MaxNewSize=size 新生成对象能占用内存的最大值
    -XX:MaxPermSize=64m 老生代对象能占用内存的最大值
    -XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
    -XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
    -XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
    -XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
    -XX:+UseLargePages 使用大页面内存
    • 行为参数

    参数及其默认值 描述
    -XX:+ScavengeBeforeFullGC 新生代GC优先于Full GC执行
    -XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
    -XX:-UseParNewGC 打开此开关,使用ParNew+Serial Old收集器
    -XX:-UseConcMarkSweepGC 使用ParNew+CMS+Serial Old收集器对老生代采用并发标记交换算法进行GC
    -XX:-UseParallelGC 启用并行GC,使用ParallelScavenge+Serial Old收集器
    -XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用,ParallelScavenge+Parallel Old收集器
    -XX:-UseSerialGC 启用串行GC
    -XX:+UseG1GC 使用垃圾优先(G1)收集器
    -XX:SurvivorRatio=n Eden区域与Survivor区域大小之比。预设值为8
    -XX:PretenureSizeThreshold=n 直接晋升到老年代的对象大小,设置这个参数之后,大于这个参数的对象直接进入到老年代分配
    -XX:MaxTenuringThreshold=n 晋升到老年代的对象年龄,每个对象在坚持过一次Minor GC之后,年龄加1,当超过这个值之后就进入老年代。预设值为15
    -XX:+UseAdaptiveSizePolicy 动态调整Java堆中各个区域的大小以及进入老年代的年龄
    -XX:ParallelGCThreads=n 设置并行收集器收集时使用的CPU数。并行收集线程数
    -XX:MaxGCPauseMillis=n 设置并行收集最大暂停时间
    -XX:GCTimeRatio=n 设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+N)
    -XX:+UseThreadPriorities 启用本地线程优先级
    -XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
    -XX:+MaxFDLimit 最大化文件描述符的数量限制

    前面6个参数都是关于垃圾收集器的行为参数,也是经常会用到的参数。

    • 调试参数

    参数及其默认值 描述
    -XX:-CITime 打印消耗在JIT编译的时间
    -XX:ErrorFile=./hs_err_pid\<pid\>.log 保存错误日志或者数据到文件中
    -XX:HeapDumpPath=./java_pid\<pid\>.hprof 指定导出堆信息时的路径或文件名
    -XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
    -XX:OnError="\<cmd args\>;\<cmd args\>" 出现致命ERROR之后运行自定义命令
    -XX:OnOutOfMemoryError="\<cmd args\>;\<cmd args\>" 当首次遭遇OOM时执行自定义命令
    -XX:-PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
    -XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
    -XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
    -XX:-PrintCompilation 当一个方法被编译时打印相关信息
    -XX:-PrintGC 每次GC时打印相关信息
    -XX:-PrintGCDetails 每次GC时打印详细信息
    -XX:-PrintGCTimeStamps 打印每次GC的时间戳
    -XX:-TraceClassLoading 跟踪类的加载信息
    -XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
    -XX:-TraceCla***esolution 跟踪常量池
    -XX:-TraceClassUnloading 跟踪类的卸载信息
    -XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息

    以上是“Java虚拟机中常用vm参数的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

    内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/112711.html

    (0)

    相关推荐

    • mysql中如何将日期转为时间戳

      技术mysql中如何将日期转为时间戳本篇内容主要讲解“mysql中如何将日期转为时间戳”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql中如何将日期转为时间戳”吧!

      攻略 2021年12月2日
    • 免费香港云服务器怎么样

      技术免费香港云服务器怎么样一些在线搜索可能会显示免费香港云,在某些情况下,选择免费的网站部署方案可能是有意义的——例如,如果您只是为了好玩而开始一个网站,并且不太关心将其构建成持久或有利可图的东西。但是对于正常运营网站的

      礼包 2021年10月19日
    • P2135 方块消除

      技术P2135 方块消除 P2135 方块消除目录题目题目描述输入格式输出格式输入输出样例思路代码
      P2135 方块消除
      题目
      https://www.luogu.com.cn/problem/UVA1

      礼包 2021年10月27日
    • python循环语句(python循环语句的运用)

      技术Python循环语句怎么用小编给大家分享一下Python循环语句怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是循环呢?简单理解

      攻略 2021年12月19日
    • Animate 2020 安装教程(附安装包资源)

      技术Animate 2020 安装教程(附安装包资源) Animate 2020 安装教程(附安装包资源)原文链接:https://www.gujin.store/tools/package/an-20

      礼包 2021年10月26日
    • 山药鸡蛋饼的做法,山药的各种做法宝宝吃法

      技术山药鸡蛋饼的做法,山药的各种做法宝宝吃法【奶香山药小馒头】铁棍山药山药鸡蛋饼的做法,面粉,牛奶1.取适量山药上锅蒸熟,压成山药泥,晾凉至室温;
      2.山药泥中加2g酵母、100ml牛奶搅拌均匀;
      3.加200g面粉和成

      生活 2021年10月24日