zoukankan      html  css  js  c++  java
  • JVM参数配置及性能监控工具

    1、开启逃逸分析

    java -server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations com.zrz.consoleapp.App
     
     
    通过 -XX:+DoEscapeAnalysis(开启逃逸分析,默认打开)、XX:+EliminateAllocations(开启标量替换,运行将对象打散分配在栈上,默认打开),使得线程的私有变量(其他线程不会访问到的变量)的空间分配在线程栈上,而不是堆上。
    jvm参数中,+号为打开指定功能,-号为关闭指定功能
     

    2、输出GC日志

    -XX:+PrintGC 
    -XX:+PrintGCTimeStamps(打印GC发生时的时间戳)
    -XX:+PrintGCDetails  (打印更加详细的GC信息,包括回收后堆空间的详细占用情况)
    -XX:+PrintHeapAtGC   (打印回收前、回收后的堆空间占用详细情况)
    -XX:+PrintGCApplicationConcurrentTime (打印回收期间应用程序的执行时间)
    -XX:+PrintGCApplicationStoppedTime (打印由于GC而产生的应用程序停顿时间)
    -XX:+PrintReferenceGC (跟踪系统内软引用、弱引用、虚引用和Finalize队列)
    -Xloggc:gc.log (将日志输出到文本文件)
     
     

    3、跟踪类的加载/卸载

    -verbose:class (跟踪类的加载/卸载)
    -XX:+TraceClassLoading (跟踪类的加载)
    -XX:+TraceClassUnloading(跟踪类的卸载)
    -XX:+PrintClassHistogram (打印当前类的实例数和空间占用情况,需要再控制台按下 Ctrl+Break触发)
     

    4、查看系统参数

    -XX:+PrintVMOptions (打印当前系统参数)
    -XX:+PrintCommandLineFlags (打印显示和隐式参数)
    -XX:+PrintFlagsFinal(打印所有系统参数的值)
     

    5、Java代码获取当前堆内存

    Runtime.getRuntime().maxMemory()
    Runtime.getRuntime().freeMemory()
    Runtime.getRuntime().totalMemory()
     

    6、新生代的配置

    -Xmn (配置新生代大小。新生代的大小一般设置为整个堆空间的1/3到1/4。由于虚拟机垃圾回收的需要,新生代实际可用空间=新生代设置的大小-from/to的大小)
    -XX:SurvivorRatio=eden/from=eden/to (设置新生代中eden区和from/to区的比例)
    -XX:NewRatio=老年代/新生代 (设置老年代和新生代的比例)
    基本策略:尽可能将对象预留在新生代,减少老年代GC的次数
     

    7、堆空间不足时导出堆信息

    症状:OutOfMemoryError异常
    -XX:HeapDumpOnOutOfMemoryError (堆溢出时dump堆信息)
    -XX:HeapDumpPath=dump.log (dump文件路径)
    "-XX:OnOutOfMemoryError=printStack.bat %p” (bat文件内容 jstack -F %1 > stack.txt。堆溢出时调用bat脚本,导出线程栈dump信息)
     

    8、方法区大小的配置

    -XX:MaxMetaspaceSize
     

    9、栈大小的配置

    -Xss10m
     

    10、垃圾回收算法

    引用计数法(Reference Counting)
    复制算法(Copying)
    标记清除法(Mark-Sweep)
    标记压缩法(Mark-Compact)
    分代算法(Generational Collecting)
    分区算法(Region)
     

    11、Java虚拟机垃圾回收器

    1)新生代串行回收器(复制算法)
    -XX:+UseSerialGC
     
    2)老年代串行回收器(标记压缩法)
    -XX:+UseSerialGC :新生代和老年代使用串行回收器
    -XX:+UseParNewGC :新生代使用ParNew回收器,老年代使用串行回收器
    -XX:+UseParallelGC :新生代使用Parallel回收器,老年代使用串行回收器
     
    3)新生代 ParNew 并行回收器(复制算法)
    -XX:+UseParNewGC :ParNewGC回收器,只是使用了多线程方式回收,仍然是独占式的回收器
    -XX:+UseConcMarkSweepGC :新生代使用ParNew回收器,老年代使用CMS
    -XX:ParallelGCThreads :指定并行线程数量,一般为cpu数量最好
     
    4)新生代 ParallelGC 并行回收器(复制算法)
    -XX:+UseParallelGC :多线程、独占式、更关注系统吞吐量,新生代使用Parallel回收器,老年代使用串行回收器
    -XX:+UseParallelOldGC :多线程、独占式、更关注系统吞吐量,新生代使用Parallel回收器,老年代使用ParallelOldGC回收器
    -XX:+MaxGCPauseMillis :设置最大垃圾回收停顿时间
    -XX:+GCTimeRatio:设置吞吐量,取值范围0~100的整数,回收的时间=系统执行总时间*1/(1+n)
    -XX:+UseAdaptiveSizePolicy :自适应GC调节策略,新生代大小、eden区和survivor区的比例、晋升老年代的对象年龄等参数会被自动调整,仅需指定虚拟机的 Xmm、GCTimeRatio、MaxGCParseMillis
     
    5)老年代 ParallelOldGC 并行回收器(标记压缩法)
    -XX:+UseParallelOldGC : 多线程、独占式、关注系统吞吐量,新生代使用Parallel回收器,老年代使用ParallelOldGC回收器
    -XX:ParallelGCThreads : 搭配使用,设置回收时的线程数量
    -XX:-ScavengeBeforeFullGC :关闭Full GC之前的新生代GC
     
    6)CMS回收器(标记清除法、标记压缩法)
    回收过程:初始标记(Stop-The-World:标记根对象) -> 并发标记(标记所有对象) -> 预清理(清理前准备及控制停顿时间) -> 重新标记(Stop-The-World:修正并发标记数据) -> 并发清理(清理垃圾) -> 并发重置
    -XX:+UseConcMarkSweepGC : 非独占式(默认启动GC并发线程数=(ParallelGCThreads+3)/4)
    -XX:+CMSInitiatingOccupancyFraction :指定回收时老年代内存使用率的阈值,默认是68%
    -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整
    -XX:+UseCMSCompactAtFullCollection :使CMS在垃圾收集完成后,进行一次内存碎片整理,以减少因内存碎片太多,剩余空间不足以分配大对象,而导致触发CMS回收的概率
    -XX:CMSFullGCsBeforeCompaction :设定进行多少次CMS回收后,进行一次内存压缩
    -XX:+CMSClassUnloadingEnabled :使用CMS回收器回收Perm区
    -XX:+CMSParallelRemarkEnabled : 是否开启并行标记
    -XX:+DisableExplicitGC :禁止代码中显示GC(也就是 System.gc() 的调用不会触发gc)
     
    7)G1回收器(分区算法,复制算法、标记清除法。全称:Garbage First Garbage Collector)
    回收过程:新生代GC -> 并发标记周期【初始标记(Stop-The-World:标记根对象)-> 根区域扫描(扫描survivor区直接可达的老年代区域,并标记这些直接可达的对象)-> 并发标记(标记所有对象)-> 重新标记(Stop-The-World:修正并发标记数据)-> 独占清理(Stop-The-World:计算各区域存活对象和GC回收比例,并进行排序,识别可供混合回收的区域)-> 并发清理 (清理完全空闲的区域)】 -> 混合回收(回收垃圾对象比例较高的区域) -> Full GC(如果需要)
    -XX:+UseG1GC
     

    12、Linux性能监控工具

    1)top
    实时显示系统中各个进程的资源占用情况
     
    2)vmstat
    统计CPU、内存使用情况、Swap使用情况
     
    3)iostat
    提供详细的I/O信息,包括磁盘和cpu
     
    4)pidstat
    通过命令安装:apt-get install sysstat
    线程的cpu占用情况:pidstat -p pid 1 3 -u -t
    线程的io占用情况:pidstat -p pid 1 3 -u -t
    进程的内存占用情况:pidstat -p pid -r 1 5
     

    13、JDK性能监控工具

    1)jps
    列出Java进程
    jps -v :显示传递给Java虚拟机的参数
     
    2)jstat
    观察Java应用程序运行时相关信息:堆信息、垃圾回收信息
    垃圾回收信息:jstat -gcutil 1000 5
    堆信息:jstat -gc 1000 5
     
    3)jinfo
    查看正在运行的Java应用程序的扩展参数,包括虚拟机参数
     
    4)jmap
    jmap -histo pid > dump.txt :对象统计信息
    jmap -dump:format=b,file=heap.hprof pid :将堆快照输出到文件
     
    5)jhat
    jhat heap.hprof : 分析Java应用程序的堆快照内容,通过 http://127.0.0.1:7000 查看分析结果
     
    6)jstack
    jstack -l pid > stack.txt 导出线程堆栈信息
     
    7)jstatd
    远程主机信息收集
     
    8)jcmd
    JDK1.7新增的命令行工具,可以用来导出堆、查看java进存、导出线程信息、执行GC
    查看Java进程:jcmd -l
    导出堆:jcmd pid GC.heap_dump d.dump
    导出线程信息:jcmd pid Thread.print > stack.txt
     
    9)jConsole
    图形化工具。可以监控堆信息、永久区使用情况、类加载情况、线程情况
     
    10)Visual VM
    图形化工具。可以替代jstat、jmap、jhat、jstack
     
    11)JCA
    线程堆栈图形化分析工具
     
    12)jmc (JRockit Mission Control)
     
    13)MAT
    堆快照分析工具
    with outgoing references : 找出当前对象应用的对象
    with incoming references : 找出引用当前对象的对象
    shallow heap :浅堆,表示一个对象自身结构所占用的内存大小
    retained heap :深堆,表示一个对象被GC回收后,可以真实释放的内存大小(实际大小包括仅被该对象引用的对象的大小)
    Dominator Tree :支配树,可查看占用内存最大的对象。 所有指向对象B的路径都经过对象A,则认为对象A支配对象B
    注意:MemoryAnalyzer.ini文件中的xmx配置默认为1024m,需调整为一个大一点的数
     
     
  • 相关阅读:
    mysql面试题
    Zookeeper与Kafka基础概念和原理
    Docker资源限制
    企业级仓库harbor搭建
    基于容器制作镜像
    docker基础学习(一)
    docker往阿里云推镜像和打包镜像
    Dockfile制作镜像
    算法Sedgewick第四版-第1章基础-006一封装输出(文件)
    算法Sedgewick第四版-第1章基础-005一封装输入(可以文件,jar包里的文件或网址)
  • 原文地址:https://www.cnblogs.com/bestzrz/p/13375545.html
Copyright © 2011-2022 走看看