JVM总结

作者: There_7f76 | 来源:发表于2019-10-15 14:49 被阅读0次

    JVM总结

    一、Server和Client启动模式

    1.1 serverVM的初始堆空间要大,启动比较缓慢但是运行速度快一般用于web开发。

    1.2 clientVM分配的初始堆空间要小一点,启动快但是运行没有server的快,一般用于java桌面级应用开发。

    (注意:在windows下无论硬件配置如何,只要是32位的操作系统默认的启动都是clientVM的,同时64位的操作系统无论是windows还是其他的操作系统只支持server模式的启动,其他操作系统则是看硬件配置,一般2G内存,且同时又2个cpu的话就是默认启动server)

    二、java的三种参数

    1. 标准参数

      标准的参数,在jvm中稳定的,在后续的版本中也会保留的参数,一般java -help查看所有的标准参数

      用法: java [-options] class [args...]
                 (执行类)
         或  java [-options] -jar jarfile [args...]
                 (执行 jar 文件)
      其中选项包括:
          -d32          使用 32 位数据模型 (如果可用)
          -d64          使用 64 位数据模型 (如果可用)
          -server       选择 "server" VM
                        默认 VM 是 server.
      
          -cp <目录和 zip/jar 文件的类搜索路径>
          -classpath <目录和 zip/jar 文件的类搜索路径>
                        用 ; 分隔的目录, JAR 档案
                        和 ZIP 档案列表, 用于搜索类文件。
          -D<名称>=<值>
                        设置系统属性
          -verbose:[class|gc|jni]
                        启用详细输出
          -version      输出产品版本并退出
          -version:<值>
                        警告: 此功能已过时, 将在
                        未来发行版中删除。
                        需要指定的版本才能运行
          -showversion  输出产品版本并继续
          -jre-restrict-search | -no-jre-restrict-search
                        警告: 此功能已过时, 将在
                        未来发行版中删除。
                        在版本搜索中包括/排除用户专用 JRE
          -? -help      输出此帮助消息
          -X            输出非标准选项的帮助
          -ea[:<packagename>...|:<classname>]
          -enableassertions[:<packagename>...|:<classname>]
                        按指定的粒度启用断言
          -da[:<packagename>...|:<classname>]
          -disableassertions[:<packagename>...|:<classname>]
                        禁用具有指定粒度的断言
          -esa | -enablesystemassertions
                        启用系统断言
          -dsa | -disablesystemassertions
                        禁用系统断言
          -agentlib:<libname>[=<选项>]
                        加载本机代理库 <libname>, 例如 -agentlib:hprof
                        另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
          -agentpath:<pathname>[=<选项>]
                        按完整路径名加载本机代理库
          -javaagent:<jarpath>[=<选项>]
                        加载 Java 编程语言代理, 请参阅 java.lang.instrument
          -splash:<imagepath>
                        使用指定的图像显示启动屏幕
      
    1. -X非标准参数

      不稳定的参数,只在这个版本中使用,在后续的版本中可能就被弃用了的一般用java -X查看

        -Xmixed           混合模式执行 (默认)
          -Xint             仅解释模式执行
          -Xbootclasspath:<用 ; 分隔的目录和 zip/jar 文件>
                            设置搜索路径以引导类和资源
          -Xbootclasspath/a:<用 ; 分隔的目录和 zip/jar 文件>
                            附加在引导类路径末尾
          -Xbootclasspath/p:<用 ; 分隔的目录和 zip/jar 文件>
                            置于引导类路径之前
          -Xdiag            显示附加诊断消息
          -Xnoclassgc       禁用类垃圾收集
          -Xincgc           启用增量垃圾收集
          -Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)
          -Xbatch           禁用后台编译
          -Xms<size>        设置初始 Java 堆大小
          -Xmx<size>        设置最大 Java 堆大小
          -Xss<size>        设置 Java 线程堆栈大小
          -Xprof            输出 cpu 配置文件数据
          -Xfuture          启用最严格的检查, 预期将来的默认值
          -Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
          -Xcheck:jni       对 JNI 函数执行其他检查
          -Xshare:off       不尝试使用共享类数据
          -Xshare:auto      在可能的情况下使用共享类数据 (默认)
          -Xshare:on        要求使用共享类数据, 否则将失败。
          -XshowSettings    显示所有设置并继续
          -XshowSettings:all
                            显示所有设置并继续
          -XshowSettings:vm 显示所有与 vm 相关的设置并继续
          -XshowSettings:properties
                            显示所有属性设置并继续
          -XshowSettings:locale
                            显示所有与区域设置相关的设置并继续
      
      -X 选项是非标准选项, 如有更改, 恕不另行通知。
      

      非标准参数最常用的三个参数(java的执行方式

      • -Xint(解释执行)

      • -Xcomp(将所有代码强制编译成本地代码再执行比解释执行快十几倍,但是会损耗JIT[即时编译器]编译器的功能)

      • -Xmixed(混合执行,也是默认的执行方式)

      PS C:\Users\11063\Desktop\java> java -showversion -Xint Test_JVM
      java version "1.8.0_91"
      Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
      Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, interpreted mode)
      
      haizi
      PS C:\Users\11063\Desktop\java> java -showversion -Xcomp Test_JVM
      java version "1.8.0_91"
      Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
      Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, compiled mode)
      
      haizi
      PS C:\Users\11063\Desktop\java> java -showversion -Xmixed Test_JVM
      java version "1.8.0_91"
      Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
      Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
      
      haizi
      PS C:\Users\11063\Desktop\java>
      
    1. -XX(使用率较高的非标准参数)

      而也是不稳定的参数,但是使用频率很高,一般用于jvm的调优。

      • -Xms<size> 设置初始 Java 堆大小

        eg:-Xms2048m:等价于-XX:MaxHeapSize

      • -Xmx<size> 设置最大 Java 堆大小

      • eg:-Xmx512m:等价于-XX:InitialHeapSize

        这两个参数是用的比较多的,对于jvm调优来说。

      • jps -l 查看jvm虚拟机后台运行的程序

      • jinfo -flag <参数名><进程id>查看具体信息

    C:\Users\11063>jps -l
    12452
    15796 org.jetbrains.jps.cmdline.Launcher
    13192 edu.haizi.demo.DemoApplication
    6552 sun.tools.jps.Jps
    2636 org.jetbrains.idea.maven.server.RemoteMavenServer
    
    C:\Users\11063>jinfo flag 13192
    Attaching to core 13192 from executable flag, please wait...
    Error attaching to core file: Windbg Error: OpenDumpFile failed!
    sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: OpenDumpFile failed!
            at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach0(Native Method)
            at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach(WindbgDebuggerLocal.java:160)
            at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
            at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:569)
            at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)
            at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
            at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
            at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
            at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
            at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)
            at sun.tools.jinfo.JInfo.main(JInfo.java:76)
    
    

    三、Jvm的内存模型

    ​ 这里拿jdk1.7和1.8做比较

    jdk1.7的内存模型

    jdk1.7内存模型.png
    • Young年轻代:其中Eden区用于存放生成的活动对象,当Eden区满了就会将对象移动到Survivor区,另外一个Survivor区则留作垃圾回收时复制对象使用,当Survivor中的对象还没有被来及回收就会将该对象移动到老年区。

    • Tenured老年区:一般保存一些生命周期比较长的对象,当系统中才采用appliaction级别的缓存时该对象就会被放入老年区。

    • Perm永久代:主要用于保存class,method,filed对象,这部分空间不会溢出,除非一次性加载了很多类,不过涉及到热部署得时候,会遇到OutOfMemoryErro:Germ space的错误。

    • Virtual区,最大内存和初始内存的差值就是Virtual区。

      jdk1.8内存模型

    jdk1.8内存模型.png

    特别说明这里的Metaspace不是占用的虚拟机的内存空间,而是占用的本地的内存空间。

    相关文章

      网友评论

          本文标题:JVM总结

          本文链接:https://www.haomeiwen.com/subject/ezdsmctx.html