JVM调优和参数配置

Posted 亮子zl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优和参数配置相关的知识,希望对你有一定的参考价值。

1.JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots
   答:什么是垃圾:简单的说就是内存中已经不再被使用到的空间就是垃圾
       要进行垃圾回收,如何判断一个对象是否可以被回收?
          1引用计数法
          
          2枚举根节点做可达性分析(根搜索路径)
               基本思路就是通过一系列名为“GC Roots”的对象作为起点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即单个元素的队列。
               给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活;没有被遍历到的就自然被判定为死亡。
          java中可以作为GC Roots的对象:
                 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
                 方法区中的类静态属性引用的对象。
                 方法区中常量引用对象。
                 本地方法栈中JNI(Native方法)引用的对象。

2.JVM调优和参数配置,请问如何盘点查看JVM系统默认值。
    答:Xms  Xms和Xmx最好要调成一致 避免GC平凡的收集忽高忽低   -Xms 等价于 -XX:InitialHeapSize 初始化的堆内存
                                       -Xmx 等价于 -XX:MaxHeapSize 初始化的堆内存
        Xmx:堆空间
        Xss:初始栈空间 
        JVM的参数类型:标配参数
                            -version 微森、-help 耗破、java-showversion
                       X参数(了解)
                            -Xint 解释执行
                            -Xcomp 第一次使用就编译成本地代码
                            -Xmixed 混合模式
                      *XX参数
                             Boolean类型
                                  公试: -XX:+或者 - 某个属性值
                                          +表示开启
                                          -表示关闭
                                  Case:是否打印GC收集细节
                                                -XX:-PrintGCDetails 
                                                -XX:+PrintGCDetails
                                        是否使用串行垃圾回收器
                                                -XX:-UseSerialGC
                                                -XX:+UseSerialGC
                                        
                             KV设值类型
                                   公试:-XX:属性key=属性值value
                                   
                                   Case: -XX:MetaspaceSize=128m   21M  元空间
                                         -XX:MaxTenuringThreshold=15
                            
                             jps:查看进程编号 -l
                             jinfo举例,如何查看当前运行程序的配置
                             jinfo -flag MetaspaceSize 4300
                             题外话(坑题):两个经典参数:-Xms和-Xmx
                                             这个你如何 解释:-Xms 等价于 -xx:InitialHeapSize 初始化的堆内存
                                                              -Xmx 等价于 -XX:MaxHeapSize 初始化的堆内存
                             第一种,查看参数盘点家底
                             jps -l
                             jinfo -flag 具体参数  java进程编号
                             jinfo -flags          java进程编号
                             jinfo -flags PrintGCDetails 13344
                             
                             第二种,查看参数盘点家底          佛拉歌s  因尼踢奥
                                     查看JVM默认值:-XX:+PrintFlagsInitial
                                                             主持要查看初始默认
                                                             公式 java -XX:+PrintFlagsInitial -version
                                                                  java -XX:+PrintFlagsInitial
                                                             主要查看修改更新
                                                    -XX:+PrintFlagsFinal    no
                                                                  java -XX:+PrintFlagsFinal -version
                                                                  java -XX:+PrintFlagsFinal
                                                             打印命令行参数
                                                                克梦按的 赖恩
                                                    -XX:+PrintCommandLineFlags
                                                                  java -XX:+PrintCommandLineFlags -version
                                    方法区
                                    可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
                                    
常用参数配置:
     -Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC                                    
    

3.你平时工作用过的JVM常用基本配置参数有哪些?
     答:常用参数 -Xms:初始大小内存,默认为物理内存1/64  
                       等价于 -XX:InitialHeapSize
                  -Xmx:最大分配内存,默认为物理内存1/4
                        等价于 -XX:MaxHeapSize 
                  -Xss:设置单个线程栈的大小,一般默认为512K - 1024K
                        等价于:-XX:ThreadStackSize       ThreadStackSize=0如果是0用的就是系统出厂默认值。
                  -Xmn:设置年轻代
                  -XX:MetaspaceSize :设置元空间大小  默认20多M  美特思贝思
                                       元空间的本质和永久代类似,都是对JVM规范中方法区的实现。
                                       不过元空间与永久代之间最大的区别在于:
                                       元空间并不在虚拟机中,而是使用本地内存
                                       因此,默认情况下,元空间的大小仅受本地内存限制
                                       -Mms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal    
                                       -Mms128m -Xmx4096m -Xss1024m -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC                                           
                 *-XX:+PrintGCDetails  低特奥思
                         输出详细GC收集日志信息
                         规律:
                         GC
                         【GC类型 GC前新生代内存占用->GC后内存占用 新生代总大小 GC前JVM堆内存占用->GC后JVM堆内存使用 JVM堆总大小 GC耗时 用户耗时 系统耗时 实际耗时】
                         
                         FullGC
                         
                  -XX:SurvivorRatio 威小
                        设置新生代中eden和S0/S1空间的比列
                        默认
                        -XX:SurvivorRatio=8,Eden:S0:S1=8:1:1
                        假如
                        -XX:SurvivorRatio=4,Eden:S0:S1=4:1:1 
                        SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同
                       
                  -XX:NewRatio
                        配置年轻代与老年代在堆结构的占比
                        默认
                        -XX:NewRatio=2新生代占1,老年代2,年轻代占整个堆的1/3
                        假如
                        -XX:NewRatio=4新生代占1,老年代4,年轻代占整个堆的1/5
                        NewRatio值就是设置老年代的占比,剩下的1给新生代
                  
                  -XX:MaxTenuringThreshold
                        设置垃圾最大年龄
                        查看默认进入老年代年龄:
                        jinfo -flag MaxTenuringThreshold 17344(进程编号)
                        -XX:MaxTenuringThreshold=15
                        
                        -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
                        如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
                        

以上是关于JVM调优和参数配置的主要内容,如果未能解决你的问题,请参考以下文章

jvm - 常用调优启动参数配置

jvm GC参数调优

这年头还有问Tomcat调优和JVM参数优化的,你还不知道怎么回答么?那么你一定需要看看这篇文章

Mysql 调优和水平扩展思路

JVM核心参数配置常用调试命令工具与调优思路

JVM常用调优参数 ——JVM篇