JVM调优常用参数和注意点备忘录
本文主要是工作过程中总结的一些jvm调优的参数和注意的地方,作为一个备忘录,先占个坑,有时间在来细化具体的实例。
- gc日志是覆盖的方式如果文件名字固定会导致上一次被覆盖可以采用这个-Xloggc:backv2_gc_%t.log
- jinfo可以动态修改java -XX:+PrintFlagsFinal -version|grep manageable这些参数
- 打印java可配置的非稳定参数:java -XX:+PrintFlagsFinal ,输出的信息中 “:=” 表明了参数被用户或者 JVM 赋值了
- jstat可以查看类加载和gc的耗时信息 -t参数表示每行前面输出时间
- java堆溢出时获取heap dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./m.hprof
- 当系统发生OOM错误时,虚拟机在错误发生时运行一段第三方脚本, 比如, 当OOM发生时,重置系统 -XX:OnOutOfMemoryError=c:\reset.bat
- 取消outofmemory警告:-XX:-UseGCOverheadLimit
- 获取GC信息
- -verbose:gc(-verbose:class可以输出类加载的信息) 或者 -XX:+PrintGC 打印gc日志
- 如果要获得更加详细的信息, 可以使用 -XX:+PrintGCDetails.
- 如果需要查看新生对象晋升老年代的实际阈值, 可以使用参数 -XX:+PrintTenuringDistribution
java8中使用这个参数没有详细输出各个年龄的分布,因为java8默认的收集器是ParallelGC和ParallelGC Old,
这个收集器注重吞吐量没有用年龄,所以没必要打印详细的年龄分布。只会显示晋升到老年代的阈值还有期望的Survivor区的预期大小。 - 输出jvm启动时的参数 -XX:+PrintFlagsInitial
- 禁用代码中显示的触发FULL GC [System.gc()]:-XX:+DisableExplicitGC
- 64位机器上压缩指针 -XX:+UseCompressedOops
- 禁用类验证 -Xverfy:none
- 禁用类元数据回收 -Xnoclassgc
- 确定堆内存大小 -Xmx 堆最大内存, -Xms对最小内存
- 合理分配新生代和老生代-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的增长空间
- 设置每个线程的堆栈大小,如:-Xss128k
- 导致jvm停顿的原因
- 垃圾收集
- 代码反优化
- Flushing code
- 类重定义如热加载
- 取消偏向锁
- 调试动作(死锁检测,输出线程堆栈)
- STW的四个阶段
- Spin阶段:因为jvm在决定进入全局safepoint的时候,有的线程在安全点上,而有的线程不在安全点上,这个阶段是等待未在安全点上的用户线程进入安全点。
- Block阶段:即使进入safepoint,用户线程这时候仍然是running状态,保证用户不在继续执行,需要将用户线程阻塞
- Cleanup:这个阶段是JVM做的一些内部的清理工作
- VM Operation. JVM执行的一些全局性工作,例如GC,代码反优化,偏向锁
- jvm停顿时间的输出:-XX:+PrintGCApplicationStoppedTime 上一次gc停顿程序运行时间 -XX:+PrintGCApplicationConcurrentTime
- jvm停顿原因分析: -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
- vmop:引发STW的原因,以及触发时间该项常见的输出有:RevokeBias、BulkRevokeBias、Deoptimize、G1IncCollectionPause。GC log可以根据该项内容定位Total time for which application threads…引发的详细信息。
- total :STW发生时,JVM存在的线程数目。
- initially_running :STW发生时,仍在运行的线程数,这项是Spin阶段的 时间来源
- wait_to_block : STW需要阻塞的线程数目,这项是block阶段的时间来源
- 输出如下
发生时间 操作 线程 总数 正在运行 等待阻塞
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
- -XX:+UnlockDiagnosticVMOptions -XX:-DisplayVMOutput -XX:+LogVMOutput -XX:LogFile=vm.log 可以将详细的停顿信息输出到日志文件中
- 来解锁任何额外的隐藏参数-XX:+UnlockDiagnosticVMOptions和-XX:+UnlockExperimentalVMOptions
- 输出启动时的参数信息和vm根据环境设置的参数信息: -XX:+PrintCommandLineFlags
- CMS垃圾收集器的理解
- java启动参数-agentlib,最常用的两种常见一个是jdwp远程调试,还有个hprof内存和CPU分析
- string的intern方法,内部实现是hash数据结构,参数StringTableSize可以用来控制散列桶的数量,java8默认是60013,自定义的话最好设置一个素数
- JIT相关参数:-Djava.compiler=NONE禁用JIT,-XX:+PrintCompilation 打印JIT编译情况
- 定制JIT编译的参数 -XX:CompileCommand
待解决:
GC overhead limit exceeded问题
JVM调优常用参数和注意点备忘录的更多相关文章
- JVM调优常用参数总结
GC通用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用TLAB,默认打开 -XX:+PrintTLAB 打印TLAB的使用情况 -XX:T ...
- JVM调优常用参数配置
堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3表示年轻代和年老代比值为1:3,年轻代占 ...
- JVM调优常用参数
JVM常用参数配置 -Xmx2048m 最大堆大小 -Xms1024m 初始堆大小 -Xmn1024m 年轻代大小 -XX:SurvivorRatio=8 Eden区与Survivor区的大小比值,设 ...
- JVM调优及参数设置
(1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持 ...
- jvm调优具体参数配置
3.JVM参数 在JVM启动参数中,可以设置跟内存.垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能.通过设置 ...
- JVM调优-GC参数
一.Throughput收集器(吞吐量)-XX:+UseParallelGC-XX:+UseParallelOldGC *参数调整:通过调整堆大小,减少GC停顿时间,增大吞吐量增强堆大小可以减少Ful ...
- (转)JVM调优常用命令(jstat、jmap、jstack)
原文:https://www.cnblogs.com/ityouknow/p/5714703.html 一.jstat jstat(JVM statistics Monitoring)是用于监视虚拟机 ...
- java面试-JVM调优和参数配置,如何查看JVM系统参数默认值
一.JVM的参数类型: 1.标配参数: java -version java -help 2.X参数: -Xmixed 混合模式(先编译后执行) -Xint 解释执行 -Xcomp 第一次使用就编译 ...
- JVM调优篇
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 一般JVM调优,重点在于调整JVM堆大小.调整垃圾回收器 jv ...
随机推荐
- JMeter 关于JMeter 正则表达式提取器的一点研究
关于JMeter 正则表达式提取器的一点研究 by:授客 QQ:1033553122 1. 实验环境: JMeter 2.13 2. 添加正则表达式提取器 右键线程组->添加-> ...
- (后台)jxl.read.biff.BiffException: Unable to recognize OLE stream
在excel中打开,另存成xls就可以.
- AIOps 平台的误解,挑战及建议(下)— AIOps 挑战及建议
本文篇幅较长,分为上,中,下,三个部分进行连载.内容分别为:AIOps 背景/所应具备技术能力分析(上),AIOps 常见的误解(中),挑战及建议(下). 前言 我大概是 5,6 年前开始接触 ITO ...
- C#-泛型类型(十六)
概述 泛型类和泛型方法兼具可重用性.类型安全性和效率,这是非泛型类和非泛型方法无法实现的 泛型通常与集合以及作用于集合的方法一起使用 泛型所属命名空间:System.Collections.Gener ...
- ASP.NET MVC之从控制器传递数据到视图方式
为了演示,先定义一个类 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string ...
- SQL Server 索引重建手册
注意: 索引重建前建议把数据库切换为完整模式,否则索引复制会在数据文件中进行,导致数据文件很大,而数据文件的收缩比日志文件的收缩要困难的多,且会对业务造成影响. 步骤一: 查询索引碎片,脚本如下,库比 ...
- lua table排序报错与解决
lua table排序 table的sort函数 比如按照大小进行排序,下面这种写法在某些情况下可能会排序错误,甚至报invalid order function for sorting table. ...
- fedora 28/29 配置 C++ 环境
最近 使用C++ 开发 更换机器的时候,还要重新配置一下 gnu 工具链.于是简单进行了安装了一下: yum install gcc yum install gcc-c++ yum install g ...
- C# -- 接口 (关键字:interface)
C#: 接口(关键字:interface) 1.代码(入门举例) class Program { static void Main(string[] args) { Console.WriteLine ...
- LeetCode算法题-Ransom Note(Java实现)
这是悦乐书的第212次更新,第225篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第80题(顺位题号是383).给定一个任意赎金票据字符串和另一个包含所有杂志字母的字符串 ...