JVM调优常用参数和注意点备忘录

本文主要是工作过程中总结的一些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的增长空间

  15. 设置每个线程的堆栈大小,如:-Xss128k
  16. 导致jvm停顿的原因
    1. 垃圾收集
    2. 代码反优化
    3. Flushing code
    4. 类重定义如热加载
    5. 取消偏向锁
    6. 调试动作(死锁检测,输出线程堆栈)
  17. STW的四个阶段
    1. Spin阶段:因为jvm在决定进入全局safepoint的时候,有的线程在安全点上,而有的线程不在安全点上,这个阶段是等待未在安全点上的用户线程进入安全点。
    2. Block阶段:即使进入safepoint,用户线程这时候仍然是running状态,保证用户不在继续执行,需要将用户线程阻塞
    3. Cleanup:这个阶段是JVM做的一些内部的清理工作
    4. VM Operation. JVM执行的一些全局性工作,例如GC,代码反优化,偏向锁
  18. jvm停顿时间的输出:-XX:+PrintGCApplicationStoppedTime 上一次gc停顿程序运行时间 -XX:+PrintGCApplicationConcurrentTime
  19. 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  
  20. -XX:+UnlockDiagnosticVMOptions -XX:-DisplayVMOutput -XX:+LogVMOutput -XX:LogFile=vm.log 可以将详细的停顿信息输出到日志文件中
  21. 来解锁任何额外的隐藏参数-XX:+UnlockDiagnosticVMOptions和-XX:+UnlockExperimentalVMOptions
  22. 输出启动时的参数信息和vm根据环境设置的参数信息: -XX:+PrintCommandLineFlags
  23. CMS垃圾收集器的理解
    1. 参数优化
    2. cms清理老年代并不是FULL GC
  24. java启动参数-agentlib,最常用的两种常见一个是jdwp远程调试,还有个hprof内存和CPU分析
  25. string的intern方法,内部实现是hash数据结构,参数StringTableSize可以用来控制散列桶的数量,java8默认是60013,自定义的话最好设置一个素数
  26. JIT相关参数:-Djava.compiler=NONE禁用JIT,-XX:+PrintCompilation 打印JIT编译情况
  27. 定制JIT编译的参数 -XX:CompileCommand

待解决:
GC overhead limit exceeded问题

原文地址:https://www.cnblogs.com/chenfangzhi/p/10328423.html

时间: 2024-10-12 23:31:14

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

JVM调优常用参数

查看dump信息 #jps #jps查看所有进程信息 #jstack -l pid > stack.log #dump出该进程的所有线程信息及状态 dump文件里的线程状态有: 死锁,Deadlock(重点关注) 死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况. 执行中,Runnable   一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换. 等待资源,Waiting

JVM调优及参数设置

(1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8. -XX:NewSize:设置年轻代大小 -XX:MaxNewSize:年轻代最大值 -XX:NewRatio 年老代与年轻代的比值 -XX:SurvivorRat

jvm调优具体参数配置

3.JVM参数 在JVM启动参数中,可以设置跟内存.垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能.通过设置我们希望达到一些目标: GC的时间足够的小 GC的次数足够的少 发生Full GC的周期足够的长 前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡. (1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小.最大值,为了防止

java面试-JVM调优和参数配置

JVM的参数类型: 1.标配参数: java -version java -help 2.X参数: -Xmixed 混合模式 -Xint  解释执行 -Xcomp 第一次使用就编译成本地代码 3.XX参数: Boolean类型:公式:-XX:+ (+表示开启 -表示关闭) 问题:如何查看一个正在运行中的java程序,它的某个JVM参数是否开启? jps -l jinfo -flag PrintGCDetails 10729 KV设值类型:公式:-XX:属性key=属性值value= 例如:-XX

jvm调优的参数设置

-XX: MaxDirectMemorySize--->设置直接内存,不设置与Java堆内存最大值一致,就是jvm虚拟机运行可支配的内存 -XX:PermSize(老年代大小)和-XX:MaxPermSize(永久代大小)--->设置方法区大小 -Xoss--->设置本地方法栈大小(实际无效,栈容量只由-Xss设定) -XX:+HeapDumpOnOutOfMemoryError--->生成内存溢出快照(查看内存溢出快照的工具,安装JDK时,有自带了几种工具,具体怎么使用百度.谷歌

JVM调优经验分享

前言 一.JVM调优知识背景简介 二.JVM调优参数简介 三.JVM调优目标 四.JVM调优经验 结束语 <br/> 本次分享探讨的JVM调优是指server端运行的JVM调优,适应版本为[1.6– 1.7], 不涉及最新的1.8版本. 假设线程池.连接池.程序代码等都已经做过优化,效果(系统吞吐量.响应性能)仍然不理想,我们就可以考虑JVM调优了. <br/> 一. JVM调优知识背景简介 1.堆与栈的概念 堆和栈是程序运行的关键:栈是运行时的单位,而堆是存储的单位. 栈解决程序

转: jvm调优参数总结

JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young generation,tenured generation和permanet generation.绝大部分的objec被分配在young gener

JVM 调优参数详解

GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor的两个区中. 2.Full GC 对整个堆进行整理,包括Young.Tenured和Perm.Full GC 比Scavenge GC要慢,因此应该尽可能减少Full GC,有如下原因可能导致Full GC a.Tenured被写满: b.P

JVM调优参数

堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作系统对内存无限制.我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m.典型设置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:设置JVM最大可用内存为3550M.-Xms3550m:设