JVM调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。
特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC一般由于以下几种情况:
旧生代空间不足
调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象
Pemanet Generation空间不足
增大Perm Gen空间,避免太多静态对象
统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
控制好新生代和旧生代的比例
System.gc()被显示调用
垃圾回收不要手动触发,尽量依靠JVM自身的机制
调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果
1)新生代设置过小
一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC
2)新生代设置过大
一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加
一般说来新生代占整个堆1/3比较合适
3)Survivor设置过小
导致对象从eden直接到达旧生代,降低了在新生代的存活时间
4)Survivor设置过大
导致eden过小,增加了GC频率
另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收
由内存管理和垃圾回收可知新生代和旧生代都有多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,JVM提供两种较为简单的GC策略的设置方式
1)吞吐量优先
JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。
这个值可由-XX:GCTimeRatio=n来设置
2)暂停时间优先
JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。
这个值可由-XX:MaxGCPauseRatio=n来设置
最后汇总一下JVM常见配置
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。
如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。
注意Survivor区有两个。
如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。
并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。
公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。
适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。
并行收集线程数。
jvm对元数据区的调优参数
jvm对元数据区的调优参数
JVM(Java虚拟机)的元数据区是用于存储类元数据的区域,包括类的结构信息、常量池、方法和字段描述等。
对于元数据区的调优参数,我们可以从不同角度来考虑。
首先,元数据区的大小可以通过参数`-XX:MetaspaceSize`和`-XX:MaxMetaspaceSize`来进行调优。
`-XX:MetaspaceSize`用于设置初始的元数据空间大小,而`-XX:MaxMetaspaceSize`用于设置元数据空间的最大大小。
可以根据应用程序的需求和性能表现来调整这些参数,以确保元数据区有足够的空间来存储类的元数据。
其次,可以通过参数`-XX:MinMetaspaceFreeRatio`和`-
XX:MaxMetaspaceFreeRatio`来调整元数据区的空闲空间大小比例。
这些参数用于控制元数据区的收缩行为,可以根据应用程序的内存使用情况来调整这些参数,以避免过度浪费内存或者过度收缩导致性能问题。
此外,还可以通过参数`-XX:MetaspaceReclaimPolicy`来调整元数据区的回收策略。
这个参数用于控制元数据区的回收行为,可以选择不同的策略来平衡内存的使用和回收效率。
除了上述参数之外,还可以通过监控工具来观察元数据区的内存使用情况,比如使用JConsole、VisualVM等工具来监控元数据区的内存占用情况,及时发现内存泄漏或者内存溢出问题,并进行相应的调优。
总之,对于JVM的元数据区调优参数,我们可以从空间大小、空闲空间比例、回收策略等多个方面进行考虑和调整,以确保元数据区能够满足应用程序的需求,并且能够保持良好的性能表现。
记一次JVMFullGC(MetadataGCThreshold)调优经历
记⼀次JVMFullGC(MetadataGCThreshold)调优经历记⼀次JVM Full GC (Metadata GC Threshold)调优经历⼀、背景:线上服务器内存使⽤超过90%,分析上⾯部署的各个服务的GC⽇志,发现有⼀个服务的JVM内存分配过⼤,使⽤率较低,有调优的空间,可以在不迁移服务或者不升级服务器配置的情况下,降低服务器内存占⽤。
JVM推荐配置原则:应⽤程序运⾏时,计算⽼年代存活对象的占⽤空间⼤⼩X。
程序整个堆⼤⼩(Xmx和Xms)设置为X的3 ~ 4倍;永久代PermSize和MaxPermSize设置为X的1.2 ~ 1.5倍。
年轻代Xmn的设置为X的1 ~ 1.5倍。
⽼年代内存⼤⼩设置为X的2 ~ 3倍。
JDK官⽅建议年轻代占整个堆⼤⼩空间的3/8左右。
完成⼀次Full GC后,应该释放出70%的堆空间(30%的空间仍然占⽤)。
观察线上发现2G的堆内存,Full GC之后的活跃对象才占⽤60M。
按照推荐设置JVM内存只需要给⼏百M就好了。
所以决定改成1G,既能够降低服务器内存占⽤,也预留了⾜够的业务增长空间。
在这个过程中,发现如下⼏个问题:GC⽇志没有时间显⽰,看起来很不⽅便GC⽇志没有滚动,时间久了,⽇志⽂件较⼤GC⽇志中存在⼤量Full GC (Metadata GC Threshold)显然第三个问题最为严重。
我们知道,元数据区主要是⽤来存储类的元数据的。
⼀般来讲,类加载完成之后,⼤⼩应该是⽐较稳定的,不会有太⼤变动。
所以可以判断,这么频繁的Full GC (Metadata GC Threshold),肯定是哪⾥出问题了。
但是我们⼀步⼀步来解决问题,⽽且GC⽇志不够详细也影响我们定位问题。
⼆、优化GC⽇志打印⾸先复习⼀下JVM的GC⽇志打印的启动参数。
详见-verbose:gc同-XX:+PrintGC-XX:+PrintGC最简单的 GC 参数会打印 GC 前后堆空间使⽤情况以及 GC 花费的时间-XX:+PrintGCDetails打印GC的详细信息,会打印 youngGC FullGC前后堆【新⽣代,⽼年代,永久区】的使⽤情况以及 GC 时⽤户态 CPU 耗时及系统CPU 耗时及 GC 实际经历的时间-XX:+PrintGCTimeStamps打印CG发⽣的时间戳,从应⽤启动开始累计的时间戳-XX:+PrintGCDateStamps打印GC发⽣的时刻,所处⽇期时间信息-Xloggc:gc.log指定GC log的位置,以⽂件输出-XX:+PrintHeapAtGC每⼀次GC前和GC后,都打印堆信息。
JVM调优总结-Xms-Xmx-Xmn-Xss
JVM调优总结-Xms-Xmx-Xmn-Xssjava启动参数共分为三类;其⼀是标准参数(-),所有的JVM实现都必须实现这些参数的功能,⽽且向后兼容;其⼆是⾮标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满⾜,且不保证向后兼容;其三是⾮Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使⽤;标准参数中⽐较有⽤的:verbose-verbose:class输出jvm载⼊类的相关信息,当jvm报告说找不到类或者类冲突时可此进⾏诊断。
-verbose:gc输出每次GC的相关情况。
-verbose:jni输出native⽅法调⽤的相关情况,⼀般⽤于诊断jni调⽤错误信息。
⾮标准参数⼜称为扩展参数⼀般⽤到最多的是-Xms512m 设置JVM促使内存为512m。
此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmx512m ,设置JVM最⼤可⽤内存为512M。
-Xmn200m:设置年轻代⼤⼩为200M。
整个堆⼤⼩=年轻代⼤⼩ + 年⽼代⼤⼩ + 持久代⼤⼩。
持久代⼀般固定⼤⼩为64m,所以增⼤年轻代后,将会减⼩年⽼代⼤⼩。
此值对系统性能影响较⼤,Sun官⽅推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈⼤⼩。
JDK5.0以后每个线程堆栈⼤⼩为1M,以前每个线程堆栈⼤⼩为256K。
更具应⽤的线程所需内存⼤⼩进⾏调整。
在相同物理内存下,减⼩这个值能⽣成更多的线程。
但是操作系统对⼀个进程内的线程数还是有限制的,不能⽆限⽣成,经验值在3000~5000左右。
-Xloggc:file与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到⼀个⽂件中,⽂件的位置最好在本地,以避免⽹络的潜在问题。
若与verbose命令同时出现在命令⾏中,则以-Xloggc为准。
-Xprof跟踪正运⾏的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。
《Java性能调优指南》
《Java性能调优指南》随着互联网的飞速发展,Java作为一种重要的编程语言,被越来越广泛地应用于各个领域。
但是,Java程序的性能问题也随之出现。
如何调优Java 程序的性能,成为了每个开发人员需要解决的难题。
本文将为大家介绍Java性能调优的指南。
一、JVM参数设置JVM(Java虚拟机)参数设置是Java性能调优的关键。
JVM有众多的参数,不同的参数设置会对Java程序的性能产生不同的影响。
常用的JVM参数设置包括以下几个方面:1. 内存设置内存是Java程序的一大瓶颈。
如果内存设置不合理,会导致Java程序频繁地进行垃圾回收,造成程序的延迟和不稳定。
在设置内存参数时需要注意以下几点:- -Xmx: 最大堆内存,设置合理的最大堆内存大小可以减少JVM的垃圾回收次数,提高程序性能。
- -Xms: 初始堆内存,设置合理的初始堆内存大小可以加快程序启动时间,提高程序性能。
- -XX:NewRatio: 新生代与老年代的比例,如果设置得当,可以减少垃圾回收的次数。
通常新生代的大小为总堆容量的1\/3或1\/4,老年代的大小为总堆容量的2\/3或3\/4。
2. 垃圾回收设置垃圾回收是Java程序中必不可少的一部分。
合理的垃圾回收参数设置可以提高程序性能。
常用的垃圾回收参数设置包括以下几点:- -XX:+UseParallelGC: 使用并行GC,适用于多核CPU。
- -XX:+UseConcMarkSweepGC: 使用CMS GC,适用于大型Web应用程序。
- -XX:+UseG1GC: 使用G1 GC,适用于大内存应用程序。
3. JIT设置JIT(即时编译器)是Java程序中非常重要的一部分。
合理的JIT参数设置可以提高程序的性能。
常用的JIT参数设置包括以下几点:- -XX:+TieredCompilation: 启用分层编译,可以提高程序启动时间和性能。
- -XX:CompileThreshold: JIT编译阈值,设置JIT编译的最小方法调用次数,可以提高程序性能。
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解J DK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。
现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java 进程消耗CPU过高......这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。
本文将对一些常用的JVM 性能调优监控工具进行介绍,希望能起抛砖引玉之用。
A、jps(Java Virtual Machine Process Status Tool) jps 主要用来输出JVM中运行的进程状态信息。
语法格式如下:jps[options] [hostid]如果不指定hostid就默认为当前主机或服务器。
命令行参数选项说明如下:-q 不输出类名、Jar名和传入main方法的参数-m 输出传入main 方法的参数-l 输出main类或Jar的全限名-v 输出传入JVM的参数比如下面:root@ubuntu:/# jps -m -l2458org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml29920 com.sun.tools.hat. Main -port 9998 /tmp/dump.dat3149 org.apache.catalina.startup.Boo tstrap start30972 sun.tools.jps.Jps -m -l8247 org.apache.catalin a.startup.Bootstrap start25687com.sun.tools.hat.Main -port 9999 dump.dat21711 mrf-center.jarB、jstack jstack主要用来查看某个Java进程内的线程堆栈信息。
jvm常用调优参数
jvm常用调优参数
JVM是JavaVirtualMachine的缩写,是Java程序运行的核心。
JVM的调优是优化Java应用程序性能的重要一环,其中调优参数的合理设置是关键。
以下是常用的JVM调优参数:
1. -Xms:设置JVM的初始内存大小,默认为物理内存的
1/64。
2. -Xmx:设置JVM的最大内存大小,超出该内存大小后会触发垃圾回收。
3. -Xmn:设置年轻代的大小,一般设置为总内存的1/3或
1/4。
4. -XX:SurvivorRatio:设置年轻代中Eden区和Survivor区的比例,默认值为8。
5. -XX:NewRatio:设置新生代和老年代的比例,默认值为2。
6. -XX:MaxPermSize:设置永久代的大小,一般设置为
256MB。
7. -XX:+UseConcMarkSweepGC:使用CMS垃圾回收器,可以减少内存抖动。
8. -XX:+UseParallelGC:使用并行垃圾回收器,可提高垃圾回收效率。
9. -XX:+HeapDumpOnOutOfMemoryError:当JVM内存溢出时,生成堆转储文件。
10. -XX:+PrintGCDetails:打印垃圾回收的详细信息。
以上是常用的JVM调优参数,通过合理地设置参数,可以优化Java应用程序的性能。
JVM_性能调优_参数列表
79
80
81 XX:ErrorFile=./hs_err_pid<pid
>.log
82 -XX:+PrintCompilation
83 -XX:+PrintGC
84 -XX:+PrintGCDetails
85 -XX:+PrintGCTimeStamps
86
XX:+PrintTenuringDistribution
65 XX:CMSIncrementalDutyCycleMin=< N> 66 XX:CMSIncrementalSafetyFactor=<N > 67 -XX:CMSIncrementalOffset=<N>
68 -XX:CMSExpAvgFactor=<N> 69 -XX:ConcGCThreads=n 70 -XX:MaxGCPauseMillis=<N> 71 -XX:GCTimeRatio=<N>
87 -XX:+TraceClassLoading
XX:+TraceClassLoadingPreorder 89 -XX:+TraceClassUnloading
88
90 -XX:+TraceClassResolution
91 -XX:+TraceClassUnloading
92 -XX:+TraceLoaderConstraints
JDK
设置JVM启动时初始内存堆的大小 设置JVM启动后动态申请堆内存的最大堆空间 为新生代分配的内存大小。 设置JVM线程栈的空间最大值。 每个线程栈大小(K),等于0时表示使用缺省值
JVM调优总结
JVM调优总结作者: 和你在一起程序员其实很痛苦的,每隔一段时间就会听到、看到很多很多新名词、新技术---囧.幸而有了互联网,有了开源、有了wiki、有了分享:)—人人为我,我为人人。
拓荒者走过的时候很痛苦,但是如果能给后来人留下点路标,是不是可以让他们少走一些弯路呢?踏着前辈的足迹我走到了这里,也应该为后来的人留下点东西。
走夜路其实不可怕,可怕的是一个人走夜路:) - 做最棒的软件开发交流社区A-PDF Number Pro DEMO: Purchase from to remove the watermark目 录1. java路上1.1 JVM调优总结-序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.2 JVM调优总结(一)-- 一些概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 1.3 JVM调优总结(二)-一些概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 1.4 JVM调优总结(三)-基本垃圾回收算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 1.5 JVM调优总结(四)-垃圾回收面临的问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 1.6 JVM调优总结(五)-分代垃圾回收详述1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 1.7 JVM调优总结(六)-分代垃圾回收详述2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 1.8 JVM调优总结(七)-典型配置举例1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26 1.9 JVM调优总结(八)-典型配置举例2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 1.10 JVM调优总结(九)-新一代的垃圾回收算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 1.11 JVM调优总结(十)-调优方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 1.12 JVM调优总结(十一)-反思 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 1.13 JVM调优总结(十二)-参考资料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .501.1 JVM调优总结-序发表时间: 2009-11-17几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西。
JVM优化配置——使用JConsole性能调优
JAVA开发我们常常会遇到内存分配和性能调优方面的要求,在新能调优方面没有固定的最优方案,这就需要我们去根据实际情况分析,然后给出最适合的方案。
因此利用JConsole可以很方便进行观察。
一、被控端配置要运行JConsole,需要首先被监控端要进行相应的配置,我们要在被控制端启动JAVA 程序时补充上如下代码:-Dcom.sun.management.jmxremote //这里指定启动JMX-Dcom.sun.management.jmxremote.port=8061 //这里是指定端口号-Dcom.sun.management.jmxremote.ssl=false //这里指定是否使用SSL进行通讯加密-Dcom.sun.management.jmxremote.authenticate=false //这里指定是否使用证书如果我们需要启用远程用户身份认证(用户名和密码),则可以加入下面的参数:-Dcom.sun.management.jmxremote.authenticate=true-Dcom.sun.management.jmxremote.password.file=$JRE_HOME/lib/management/p assword.properties //这里指定你放置的password.properties 文件的路径-Dcom.sun.management.jmxremote.access.file=$JRE_HOME/lib/management/acce ss.properties 这里指定你放置的access.properties文件的路径这里的password.properties 和access.properties文件可以从JRE_HOME/lib/management/目录下去复制jmxremote.password.template文件到指定目录下,并将其改名为password.properties 。
JVM参数调优CMS垃圾收集器相关核心参数
JVM参数调优CMS垃圾收集器相关核心参数在JVM参数调优过程中,垃圾收集器的选择和参数的调整是非常重要的一部分。
众多垃圾收集器中,CMS(Concurrent Mark Sweep)是一种以低延迟为目标的垃圾收集器,在大内存应用中被广泛使用。
以下是CMS垃圾收集器相关的核心参数及其调优方法。
1. -XX:+UseConcMarkSweepGC:表示使用CMS垃圾收集器,该参数必须开启才能使用CMS。
2. -XX:+UseCMSInitiatingOccupancyOnly:表示只根据设置的阈值来触发CMS收集,而不是根据时间来触发。
可以根据业务场景和经验调整该阈值,建议范围在60-80之间。
3. -XX:CMSInitiatingOccupancyFraction:表示CMS触发垃圾收集的阈值,即老年代的占用率达到多少时触发。
默认值是92%,可以根据业务的内存使用情况进行调整。
如果CMS收集频繁而且停顿时间长,则可以适当降低该值。
4. -XX:+ParallelRefProcEnabled:表示启用并行清除引用(Parallel Ref Proc),可以加快CMS的回收速度,推荐使用。
5. -XX:CMSWaitDuration:表示CMS线程等待低级别垃圾收集器的时间,单位毫秒。
根据系统的性能和业务负载情况进行调整,如果系统压力较大,可以适当增加该值,防止CMS线程长时间等待。
6. -XX:CMSMaxAbortablePrecleanTime:表示CMS在发生冲突时放弃预清理所花费的最长时间。
默认值为5秒,如果CMS预清理时间超过该值,则会放弃预清理并尝试重新执行,并增加CMS收集的停顿时间。
7. -XX:ParallelGCThreads:表示垃圾收集的线程数目。
可以根据硬件的CPU核心数和应用的负载情况进行调整。
8. -XX:+ExplicitGCInvokesConcurrent:表示在显示调用System.gc(时,同时触发CMS的垃圾收集。
