本文主要是工作过程中总结的一些jvm调优的参数和注意的地方,作为一个备忘录,先占个坑,有时间在来细化具体的实例。

  1. gc日志是覆盖的方式如果文件名字固定会导致上一次被覆盖可以采用这个-Xloggc:backv2_gc_%t.log
  2. jinfo可以动态修改java -XX:+PrintFlagsFinal -version|grep manageable这些参数
  3. 打印java可配置的非稳定参数:java -XX:+PrintFlagsFinal ,输出的信息中 “:=” 表明了参数被用户或者 JVM 赋值了
  4. jstat可以查看类加载和gc的耗时信息 -t参数表示每行前面输出时间
  5. java堆溢出时获取heap dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./m.hprof
  6. 当系统发生OOM错误时,虚拟机在错误发生时运行一段第三方脚本, 比如, 当OOM发生时,重置系统 -XX:OnOutOfMemoryError=c:\reset.bat
  7. 取消outofmemory警告:-XX:-UseGCOverheadLimit
  8. 获取GC信息
    1. -verbose:gc(-verbose:class可以输出类加载的信息) 或者 -XX:+PrintGC 打印gc日志
    2. 如果要获得更加详细的信息, 可以使用 -XX:+PrintGCDetails.
    3. 如果需要查看新生对象晋升老年代的实际阈值, 可以使用参数 -XX:+PrintTenuringDistribution

      java8中使用这个参数没有详细输出各个年龄的分布,因为java8默认的收集器是ParallelGC和ParallelGC Old,

      这个收集器注重吞吐量没有用年龄,所以没必要打印详细的年龄分布。只会显示晋升到老年代的阈值还有期望的Survivor区的预期大小。

    4. 输出jvm启动时的参数 -XX:+PrintFlagsInitial
  9. 禁用代码中显示的触发FULL GC [System.gc()]:-XX:+DisableExplicitGC
  10. 64位机器上压缩指针 -XX:+UseCompressedOops
  11. 禁用类验证 -Xverfy:none
  12. 禁用类元数据回收 -Xnoclassgc
  13. 确定堆内存大小 -Xmx 堆最大内存, -Xms对最小内存
  14. 合理分配新生代和老生代-Xmn 新生代大小, -XX:SurvivorRatio Eden和Survivor空间的比例 默认是8 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4 默认是2

老年代和新生代大小比例调节:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:

a.本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理

b.通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间

  1. 设置每个线程的堆栈大小,如:-Xss128k
  2. 导致jvm停顿的原因
    1. 垃圾收集
    2. 代码反优化
    3. Flushing code
    4. 类重定义如热加载
    5. 取消偏向锁
    6. 调试动作(死锁检测,输出线程堆栈)
  3. STW的四个阶段
    1. Spin阶段:因为jvm在决定进入全局safepoint的时候,有的线程在安全点上,而有的线程不在安全点上,这个阶段是等待未在安全点上的用户线程进入安全点。
    2. Block阶段:即使进入safepoint,用户线程这时候仍然是running状态,保证用户不在继续执行,需要将用户线程阻塞
    3. Cleanup:这个阶段是JVM做的一些内部的清理工作
    4. VM Operation. JVM执行的一些全局性工作,例如GC,代码反优化,偏向锁
  4. jvm停顿时间的输出:-XX:+PrintGCApplicationStoppedTime 上一次gc停顿程序运行时间 -XX:+PrintGCApplicationConcurrentTime
  5. jvm停顿原因分析: -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
    1. vmop:引发STW的原因,以及触发时间该项常见的输出有:RevokeBias、BulkRevokeBias、Deoptimize、G1IncCollectionPause。GC log可以根据该项内容定位Total time for which application threads…引发的详细信息。
    2. total :STW发生时,JVM存在的线程数目。
    3. initially_running :STW发生时,仍在运行的线程数,这项是Spin阶段的 时间来源
    4. wait_to_block : STW需要阻塞的线程数目,这项是block阶段的时间来源
    5. 输出如下
          发生时间    操作                        线程   总数   正在运行        等待阻塞
      vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
      0.462: ForceSafepoint [ 8 0 1 ] [ 0 0 0 0 0 ] 0
  6. -XX:+UnlockDiagnosticVMOptions -XX:-DisplayVMOutput -XX:+LogVMOutput -XX:LogFile=vm.log 可以将详细的停顿信息输出到日志文件中
  7. 来解锁任何额外的隐藏参数-XX:+UnlockDiagnosticVMOptions和-XX:+UnlockExperimentalVMOptions
  8. 输出启动时的参数信息和vm根据环境设置的参数信息: -XX:+PrintCommandLineFlags
  9. CMS垃圾收集器的理解
    1. 参数优化
    2. cms清理老年代并不是FULL GC
  10. java启动参数-agentlib,最常用的两种常见一个是jdwp远程调试,还有个hprof内存和CPU分析
  11. string的intern方法,内部实现是hash数据结构,参数StringTableSize可以用来控制散列桶的数量,java8默认是60013,自定义的话最好设置一个素数
  12. JIT相关参数:-Djava.compiler=NONE禁用JIT,-XX:+PrintCompilation 打印JIT编译情况
  13. 定制JIT编译的参数 -XX:CompileCommand

待解决:

GC overhead limit exceeded问题

JVM调优常用参数和注意点备忘录的更多相关文章

  1. JVM调优常用参数总结

    GC通用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用TLAB,默认打开 -XX:+PrintTLAB 打印TLAB的使用情况 -XX:T ...

  2. JVM调优常用参数配置

    堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3表示年轻代和年老代比值为1:3,年轻代占 ...

  3. JVM调优常用参数

    JVM常用参数配置 -Xmx2048m 最大堆大小 -Xms1024m 初始堆大小 -Xmn1024m 年轻代大小 -XX:SurvivorRatio=8 Eden区与Survivor区的大小比值,设 ...

  4. JVM调优及参数设置

    (1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持 ...

  5. jvm调优具体参数配置

    3.JVM参数 在JVM启动参数中,可以设置跟内存.垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能.通过设置 ...

  6. JVM调优-GC参数

    一.Throughput收集器(吞吐量)-XX:+UseParallelGC-XX:+UseParallelOldGC *参数调整:通过调整堆大小,减少GC停顿时间,增大吞吐量增强堆大小可以减少Ful ...

  7. (转)JVM调优常用命令(jstat、jmap、jstack)

    原文:https://www.cnblogs.com/ityouknow/p/5714703.html 一.jstat jstat(JVM statistics Monitoring)是用于监视虚拟机 ...

  8. java面试-JVM调优和参数配置,如何查看JVM系统参数默认值

    一.JVM的参数类型: 1.标配参数: java -version java -help 2.X参数: -Xmixed 混合模式(先编译后执行) -Xint  解释执行 -Xcomp 第一次使用就编译 ...

  9. JVM调优篇

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 一般JVM调优,重点在于调整JVM堆大小.调整垃圾回收器 jv ...

随机推荐

  1. Windows 批处理获取某路径下最新创建的文件的名称

    批处理获取某路径下最新创建的文件的名称 by:授客 QQ:1033553122 echo off setlocal enabledelayedexpansion rem 设置文件所在目录 set sr ...

  2. 函数纹理(国际象棋棋盘纹理&粗布纹理)MFC

    函数纹理(国际象棋棋盘纹理&粗布纹理)MFC实现  源码百度云下载 国际象棋棋盘纹理(效果图见最后) //国际象棋纹理函数 //g(u, v) = a , 向下取整(8u)+向下取整(8v) ...

  3. 转载:使用redis+flask维护动态代理池

    githu源码地址:https://github.com/Germey/ProxyPool更好的代理池维护:https://github.com/Python3WebSpider/ProxyPool ...

  4. BitnamiRedmine配置邮件系统备忘

    前几天安装的Redmine邮件系统存在问题,需要换一个,方法记录如下: 修改配置文件: cd ~/redmine/apps/redmine/htdocs/config vi configuration ...

  5. Key Lookup开销过大导致聚集索引扫描

    以前总结过一篇文章SQL SERVER中什么情况会导致索引查找变成索引扫描 介绍了几种索引查找(Index Seek)变成索引扫描(Index Scan)的情形.昨天写一篇文章的时候,也遇到了一个让人 ...

  6. [20180813]刷新共享池与父子游标.txt

    [20180813]刷新共享池与父子游标.txt --//测试刷新共享池与父子游标含有那些信息保存在共享池.--//自己最近遇到的问题,感觉自己以前理解有点乱,测试看看. 1.环境SCOTT@book ...

  7. python len()函数的用法

    函数:len() 返回字符串.列表.字典.元组等长度. 语法:len(str) str:要计算的字符串.列表.字典.元组等 返回值:字符串.列表.字典.元组等元素的长度. Test: 1:计算字符串的 ...

  8. 智能合约 solidity 开发的环境基本搭建

    以太坊Dapp开发快速入门 以太坊为开源社区,虽然设计东西都很优秀,但是组件十分的杂乱,因此下面首先简单介绍下以太坊的一些常用组件以及各种工具介绍 Geth Geth是由以太坊基金会提供的官方客户端软 ...

  9. Unity的AssetDatabase路径格式

    开发环境 windows 7 Unity 5.3 及更高版本 前言 使用AssetDatabase.Load或AnimatorController.CreateAnimatorControllerAt ...

  10. Ubuntu 12.04上安装 MongoDB并运行

    Ubuntu 12.04上安装 MongoDB并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在Terminal输入 sudo apt-key ...