1、基本概念
heap=young+old,不包括perm区
young=eden + from_survivor + to_survivor,实际可用的大小是eden + to_survivor
串行收集器-单cpu使用,相对高效
并行收集器-多cpu,吞吐量优先时使用
并发收集器-多cpu,停顿时间优先时使用(web应用一般用这个)
2、基本JVM参数
-Xmx64m 最大heap大小,默认物理内存的1/4(但是限制<1GB)
-Xms64m 初始heap大小,默认物理内存的1/64(但是限制<1GB)
-Xmn12m young代大小,sun推荐整个heap的3/8,太大会减少old的大小,引发较频繁的major gc
-Xss256k 每个线程的堆栈大小,一般256就ok了
-XX:SurvivorRatio=16 eden与一个survivor的比值,默认是8
-XX:+DisableExplicitGC 关闭System.gc()
3、CMS收集相关参数
-XX:+UseConcMarkSweepGC 使用CMS内存收集
-XX:+UseCMSCompactAtFullCollection 在full gc的时候,对old区压缩
-XX:CMSFullGCsBeforeCompaction=1 多少次full gc后进行old区压缩,cms会产生old区"碎片",要进行整理,避免没有连续空间放大对象而引发cms failure出现
-XX:CMSInitiatingOccupancyFraction=70 old区使用70%后开始CMS收集,jdk5默认68%,jdk6默认92%
-XX:CMSInitiatingPermOccupancyFraction=70 perm区使用70%后开始CMS收集,jdk5默认68%,jdk6默认92%
-XX:+CMSClassUnloadingEnabled 允许perm区不够引发full gc时perm区的类卸载
-XX:+UseParNewGC 设置年轻代为并行收集
-XX:ParallelGCThreads=4 并行收集器的线程数,此值最好配置与处理器数目相等
-XX:MaxTenuringThreshold=3 垃圾最大年龄,jdk5之前,cms收集器默认为0,jdk6默认为4
4、GC日志辅助参数
-XX:+PrintGCDetails 输出gc详细信息
-XX:+PrintGCTimeStamps 输出gc时间戳,java 6之后使用-XX:+PrintGCDateStamps,阅读更方便
-Xloggc:filename gc日志文件路径
-XX:+PrintTenuringDistribution survivor的对象进入old区之前进行了几次copy,与设置的-XX:MaxTenuringThreshold比较,调整此值和survivor大小
5、各个参数调整经验
heap大小:在保证os顺畅运转的前提下,heap尽量大。
young区:
尽量大,过小可能引发频繁major gc,降低吞吐量,同时可能导致对象直接进入old区,如果old满了,触发full gc;
过大会引起回收耗时过长,导致应用停顿,gui程序不要太大的young区。
old区:
过大会导致old回收过慢,应用停顿较长(实际上cms回收是很快的,所以尽量大些,减少cms gc频率);
过小会导致产生old区小碎片,放不下大对象,引起频繁full gc。
如果用了缓存,old区要适当大些,同时缓存不应该无限增长。
young与old的调整原则:要考虑old区的耗时、频率,尽可能降低这两个值。
6、minor gc,回收young区
当young代满了(即eden区放不下新创建的对象),触发minor gc,只回收young区的对象,old区不回收。
young区被回收的对象越多,gc速度越快,因为young区采用的是“复制”的方式,即把enden区和survivor的from区存活对象复制到survivor的to区。
如果设置了-XX:MaxTenuringThreshold=N参数,survivor的from区对象到to的复制达到了N次,进入old区,如果to区装不下,直接进入old区。
关于promotion failed:
引发的两个原因:
1)survivor太小了,survivor里面的对象还没有到达进入old的copy次数
2)进入old区的对象太多,而old区已经不够用了
这两个情况都会引发full gc,导致停顿较长。
第一个可以调整survivor的大小,或者直接去掉-XX:MaxTenuringThreshold参数,minor gc回收不掉直接进入old区;
第二个可以调小young、增大old的大小(尽早触发minor gc,减少每次进入old的对象数量),或者调小-XX:CMSInitiatingOccupancyFraction(尽早触发old的回收)
7、cms gc,回收old区
步骤:initial-mark> concurrent-mark> concurrent-preclean> remark> concurrent-sweep> concurrent-reset
除了initial-mark、remark之外,不暂停应用。
关于concurrent mode failure:
引发的两个原因
1)年老代变满之前,old区垃圾回收还没有完成
2)新空间分配请求在年老代的剩余空间中无法得到满足,日志:[GC 90010.628: [ParNew: 261760K->261760K(261952K), 0.0000350secs]90010.628: [CMS (concurrent mode failure)
第一个需要调小old区,或者调小参数-XX:CMSInitiatingOccupancyFraction=70,以尽快回收old区,减少old回收时间;
第二个需要减少young、增加old的大小,或者使用-XX:CMSFullGCsBeforeCompaction并设置较小的值,提高full gc后压缩old的频次,避免young大对象无法晋升到old。
参考文献:
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
http://blog.csdn.net/sfdev/article/details/4483442
http://blog.csdn.net/cpzhong/article/details/6912272
分享到:
相关推荐
"用于测试jvm gc调优-share-jvm-gc.zip"这个压缩包文件很可能包含了一些工具、脚本或教程,用于帮助我们了解和实践JVM的垃圾收集优化。 首先,我们需要理解JVM GC的基本原理。垃圾收集器的主要任务是识别并回收不再...
JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...
**JVM体系结构与GC调优** Java虚拟机(JVM)是Java应用程序的核心组成部分,它为Java程序提供了一个运行时环境。理解JVM的体系结构对于优化Java应用的性能至关重要,尤其是垃圾收集(Garbage Collection, GC)的...
### JVM_GC调优详解 #### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,我们首先来了解一下JVM的基本组成部分。 1. **类装载器子系统(Class ...
### JVM_GC_调优总结 #### 一、GC(Garbage Collection)概述 **1.1 GC的概念** - **定义**: GC(Garbage Collection),即垃圾收集器,用于跟踪内存中的对象,并自动回收那些不再被其他对象引用的对象,释放这...
JVM 内存的系统级的调优主要的目的是减少 GC 的频率和 Full GC 的次数,过多的 GC 和 Full GC 是会占用很多的系统资源(主要是 CPU),影响系统的吞吐量。特别要关注 Full GC,因为它会对整个堆进行整理,导致 Full ...
大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...
JVM性能调优总结 JVM性能调优是Java开发中非常重要的一方面,直接影响到系统的性能和稳定性。本文将总结JVM性能调优的经验和技巧,并提供一些实用的配置参数和建议。 一、堆大小设置 堆大小是JVM性能调优中的一个...
常见的GC调优策略包括: 1. 选择合适的GC算法:如Parallel、Concurrent Mark Sweep (CMS)、G1、ZGC或Shenandoah等。 2. 调整新生代和老年代的大小,避免Full GC频繁发生。 3. 使用CMS或G1等并发收集器,减少应用...
### 个人总结之—JVM性能调优实战 #### 概述 本文档是一篇关于JVM(Java虚拟机)性能调优的经典实战总结。在实际应用开发与维护过程中,JVM性能调优是一个非常重要的话题,它直接关系到应用程序运行效率、资源利用...
《JVM和GC详解及调优》是一本深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的专业...对于团队负责人或系统架构师而言,理解JVM和GC调优也是必不可少的技能,有助于提升整个系统的稳定性和效率。
JVM参数调优是优化Java应用程序性能的关键环节,尤其是在服务器端的应用中,如Web服务器Resin。本实践案例中,作者分别尝试了三种不同的垃圾回收(GC)策略:串行回收、并行回收和并发回收,并针对每种策略提供了...
【标题】: "第04章 大促高并发系统下JVM如何调优指导03.pdf" 在大型促销活动期间,高并发系统的性能优化至关重要,尤其是Java虚拟机(JVM)的调优,它直接影响应用程序的响应速度和稳定性。本章节主要探讨了在亿级...
GC调优主要是对JVM的垃圾回收机制进行调整,以确保内存的有效利用和避免系统出现长时间的暂停。垃圾回收是JVM自动管理内存的过程,其目标是回收不再使用的对象所占用的内存空间。主要涉及以下几个方面: 1. **垃圾...
JVM性能调优 JVM(Java Virtual Machine)是Java程序执行的核心组件,负责执行Java字节码指令。JVM性能调优是Java开发者应该掌握的重要技能,以下是JVM性能调优的知识点总结: JVM基础知识 * 虚拟机:是一种软件...
总结来说,JVM性能调优中的垃圾回收(GC)和内存管理是确保Java应用高效运行的关键。了解Java对象引用类型、垃圾回收算法以及分代处理垃圾的概念是进行JVM性能调优的基础。这些知识点对于准备Java面试的开发者来说,...
GC调优是JVM性能优化的关键环节,涉及GC参数的调整,如新生代与老年代的比例、存活对象的阈值、并发比等。通过合理设置这些参数,可以实现更高效的内存回收,降低应用暂停时间,提高整体性能。同时,理解GC日志,...
jvm体系结构与GC调优,图文齐飞,方便理解,,非常适合入门的java工程师以及性能测试工程师阅读,欢迎大家下载
Java虚拟机(JVM)参数调优和相关工具的使用对于优化Java应用程序的性能至关重要。JVM负责管理和分配内存,其中垃圾收集(GC)是其核心功能,它自动管理内存,确保活动对象保留在内存中,同时释放不再使用的对象以...