zoukankan      html  css  js  c++  java
  • 第二章、JVM调优

    一、JVM调试小程序介绍

      安装JDK后,在安装文件夹bin中有很多的小程序,这些小程序都是安装时自带的:

     

                                                    图1:bin目录下的小程序

    具体有如下列表所示:

    JVM小工具 
    jps

    打印Hotspot VM进程

    VMID,JVM参数,main()函数,主类名/jar路径
    jstat 查看HotSpot VM 运行时信息 类加载、内存、GC(可分代查看)、JIT编译命令格式:jstat -gc 10340 250 20
    jinfo  查看和修改虚拟机各项配置  -flag name=value

    jmap

    heapdump:生成VM堆转储快照、查询finallize执行队列、java堆和永久代详细信息 jmap -dump:live,format=b,file=heap.bin【VMID】
    jstack  查看VM当前时刻的线程快照,当前VM内每一条线程正在执行的方法堆栈集合 Thread.getAllStackTraces() 提供了类似的工能
    javap 产看javac之后产生的JVM字节代码 自动解析.class文件,避免了去理解class文件格式以及手动解析class文件内容
    jcmd 一个多功能工具,可以导出堆,查看java进程,导出线程信息,执行gc,查看性能相关的数据等 几乎集合了jps,jstat,jinfo,jmap,jstack所有的功能
    jconsole 基于JMX的可视化监控,管理工具 可以查看内存,线程,类,cpu信息,以及对JMX MBean进行管理
    jvisualvm JDK中最强大的运行监视和故障处理工具 可以监控内存泄漏,跟踪垃圾回收,执行时内存分析,CPU分析,线程分析等等

    演示jps小程序

    cmd到bin目录下:命令行介绍

    jps –v  就是查看当前正在运行的虚拟机的线程的展示

    jps –v 查看当前运行的虚拟机的版本

                                                                                     图2:jps小程序命令

    例如启动一个虚拟机,由于tomcat是依赖虚拟机的,所以我们启动一个tomcat服务器就会自动启动虚拟机。双击命令行脚本文件startup.bat 可以运行tomcat,如果启动失败就是tomcat安装的问题。比如拷贝其他人,盘符未修改等会导致错误。

           

                                图3:tomcat 启动小程序statup.bat                                                                     

                                               图4:tomcat 启动成功 

    重新运行jps –l       jps -v   显示了进程就可以看到JVM虚拟机的信息

                                                                               图5:jps显示JVM信息

    演示jstat小程序

    第二个jstat小程序,可以查看GC等信息,通过jps -l 可以查看到进程的pid(tomcat的是10808),在jstat 中敲入:jstat -gc 10808 1 5

    gc 表示垃圾回收   10808 表示进程的PID   1 表示1秒钟   5 表示收集5次信息

                                                                  图6:jstat显示gc信息

    具体的参数定义如下所示

    S0C :表示S0区(年轻代的第一个区域)创建空间大小:字节

    S1C :表示S1区(年轻代的第二个区域)创建空间大小:字节

    S0U :表示S0区(年轻代的第一个区域)使用空间大小:字节

    S1U :表示S1区(年轻代的第二个区域)使用空间大小:字节

    EC:  eden区创建大小:字节

    EU:  eden区使用大小:字节

    OC: old区创建大小:字节

    OU:old使用大小:字节

    YGC:年轻代次收集器:收集次数1次

    YGCT:收集时间:秒

    FGC:full收集器收集:次数

    GCT:两个收集器一共收集花费的时间:秒

    有一些还有显示PC PU 表示持久代的创建和使用的大小这里没有显示

    其他的小程序使用类似,对应的命令行与参数可以百度。

    二、下面主要介绍jvisualvm

    jvisualvm是一个图形化界面展示当前vm里面的一些信息,cmd中运行jvisualvm.exe 后会显示

                                                       图7:jvisualvm运行 

                                                             图8:jvisualvm页面

    这个软件可视化的提供了内存监控手段

                                                                           图9:jvisualvm页面

    重要插件讲解:com-sun-tools-visualvm-modules-visualgc_1.nbm     Visual GC

    插件跟新网址:https://visualvm.github.io/archive/uc/7u60/updates.xml.gz  : 工具->插件->设置->编辑->https://visualvm.github.io/archive/uc/7u60/updates.xml.gz->可用插件->Visual GC->安装即可安装插件,安装成功之后需要重启jvisualvm,就会多出来一个插件。

                                                                                                      图10:插件页面

     三、内存参数优化设计

    参数设置可以参考

    https://jingyan.baidu.com/article/0eb457e5083dd303f1a905fb.html

    https://blog.csdn.net/yrwan95/article/details/82826519

     3.1 内存参数设置

    1. 堆设置
      • -Xms:初始堆大小
      • -Xmx:最大堆大小
      • -Xmn:新生代大小
      • -XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
      • -XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5  
      • -XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
      • -XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
      • -XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
    2. 收集器设置
      • -XX:+UseSerialGC:设置串行收集器
      • -XX:+UseParallelGC:设置并行收集器
      • -XX:+UseParalledlOldGC:设置并行老年代收集器
      • -XX:+UseConcMarkSweepGC:设置并发收集器
    3. 垃圾回收统计信息
      • -XX:+PrintGC
      • -XX:+PrintGCDetails
      • -XX:+PrintGCTimeStamps
      • -Xloggc:filename
    4. 并行收集器设置
      • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
      • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
      • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
    5. 并发收集器设置
      • -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
      • -XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。

    3.2 常见参数设置

    JVM中最大堆大小有三个方面的限制:相关操作系统的数据模型(32-bit还是64bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G-2G;64位操作系统对内存无限制。windows server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置位1478m。

    典型设置:

    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

    Xmx3550m:设置JVM最大可用内存为3550M。

    -Xms3550m:设置JVM初始化内存为3550M,此值可以设置与-Xmx相同,以避免每次垃圾回收之后JVM重新分配内存。

    -Xmn2g:设置年轻代大小为2G.整个堆大小=年轻代大小+老年代大小+持久代大小。持久代一般固定为64M所以增大年轻代后,会减小老年代的大小,此值堆系统的性能影响较大,sun公司官方推荐配置为整个堆得3/8。

     -Xss128k:设置每个线程的堆栈大小。JDK5.0后每个线程堆栈大小为1M,以前每个线程堆栈大小为256k。根据应用的线程所需内存大小进行调整,在相同物理条件下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成。一般在3000-5000左右。

    • java -Xmx3550m -Xms3550m -Xss128k -XX:newRatio=4 -XX:SurvivoRatio=4 -XX:MaxPermSize = 16m -XX:MaxTenuringThreshold=0

    -XX:newRatio=4:设置年轻代(包括Eden和两个Survivor区)与老年代的比值(除去持久代)。设置为4,则年轻代与老年代的所占的额比值为1:4元,年轻代占整个堆栈的1/5。

    -XX:SurvivorTatio=4:设置年轻代中Eden区与Suivivor区的大小比值。设置为4,则连个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

    --:MaxPermSize=16m:设置持久代的大小为16m

    -XX:MaxTenuringThrehold=0:设置垃圾的最大年龄。如果设置为0的话。则年轻代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个比较大的值,则年轻代对象会在Survivor区进行多次的复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

    回收器选在JVM给了三种选择,串行收集器,并行收集器,并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择器主要针对的并行选择器和并发选择器。默认的情况下,JDK5.0以前都是使用的串行收集器,如果想使用其他收集器需要启动时间加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。

     3.3 吞吐量优先的并行收集器

    并行收集器朱啊哟以达到一定的吞吐量为目标,适用于科学技术和后台处理等。

    典型配置:

    • java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallerIGC

    -XX:ParallerIGCThreads=20 -XX:UseParallerIGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而老年代仍然使用串行收集。-XX:ParalleIGC Threads=20:配置并行收集器的总线程数,即:同时多少个线程一起进行垃圾回收,此值最好配置与处理器数目相同。

    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k  -XXuseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

    -XX:+UseParallelOldGC:配置老年代垃圾收集器方式为并行收集。JDK6.0支持对老年代并行收集。

    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:UseParallelGC -XX:MaxGCPauseMillis=100

     -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

    • java -Xmx3550m -Xms3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:UseAdaptiveSizePolicy 

    -XX:UseAdaptiveSizePolicy:设置此值后垃圾收集器会自动选择年轻代和老年代的比例,以适应当前情况。

     四、调优总结

    年轻代大小的选择

    • 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达老年代的对象。
    • 吞吐量有限的应用:尽可能设置大,可能到达Gbit的程度,因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。没有老年代大小的选择。
    • 响应时间优先的应用:老年代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数,如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式,如果堆大了,则需要较长的收集时间。 
    你是一只猪
  • 相关阅读:
    Sumdiv POJ
    Tallest Cow POJ
    P2280 [HNOI2003]激光炸弹(二维前缀和)
    Strange Towers of Hanoi POJ
    Manjaro (KDE)安装踩坑记录
    Petya and Array CodeForces
    CodeForces
    Philosopher’s Walk(递归)
    2018 icpc 青岛网络赛 J.Press the Button
    POJ 1003: Hangover
  • 原文地址:https://www.cnblogs.com/guyibade/p/13920283.html
Copyright © 2011-2022 走看看