1. 停顿时间 :垃圾收集器做垃圾回收中断应用执行的时间。 -XX:MaxGCPauseMillis
2. 吞吐量 :垃圾收集的时间和总时间的占比:1/(1+n),吞吐量计算公式为1-1/(1+n), 吞吐量越大,证明性能越好。 -XX:GCTimeRatio=n
二、GC调优步骤
1. 打印GC日志
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log
Tomcat则直接加在JAVA_OPTS变量里
* 分析日志得到关键性指标
* 分析GC原因,调优JVM参数(工具:gceasy,GCViewer)
2. GC常用参数
堆栈设置
-Xss:每个线程的栈大小
-Xms:初始堆大小,默认物理内存的1/64
-Xmx:最大堆大小,默认物理内存的1/4
-Xmn:新生代大小
-XX:NewSize:设置新生代初始大小
-XX:NewRatio:默认2,表示新生代占老年代的1/2,占整个堆内存的1/3
-XX:SurivivorRatio:默认8,表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存
-XX:MetaspaceSize:设置元空间大小
-XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
收集器设置:
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParallelOldGC:老年代使用并行收集器
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseConcMarkSweepGC:设置CMS并行收集器
-XX:UseG1GC:设置G1收集器
并行收集器设置:
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:MaxGCPauseMillis:设置并行收集最大暂停时间
-XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比
-XX:YongGenerationSizeIncrement:年轻代GC后扩容的比例,默认是20%
CMS收集器设置
-XX:+UseConcMarkSweepGC:设置CMS并发收集器
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
-XX:ParallelGCThreads:设置并发收集器的线程数
-XX:CMSFullGCsBeforeCompanction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阈值的时候,才进行CMS回收
-XX:+CMSIncrementalMode:设置为增量模式,适用于单CPU情况
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器袭启友在老年代拍槐空间被使用多少后触发
-XX:+UseCMSCompactAtFullConllection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
G1收集器设置旁茄
-XX:+UseG1GC:使用G1收集器
-XX:ParallelGCThreads:设置并发收集器的线程数
-XX:G1HeapRegionSize:制定分区大小(1MB~32MB,必须是2的幂),默认将整个堆划分为2048个分区
-XX:GCTimeRatio:吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾回收
-XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
-XX:G1NewSizePercent:新生代内存初始空间(默认堆的5%)
-XX:G1MaxNewSizePercent:新生代内存最大空间
-XX:TargetSurvivorRatio:Survivor填充容量(默认50%)
-XX:MaxTenuringThreshold:最大任期阈值(默认15%)
-XX:InitiatingHeapOccupancyPercen:老年代占空间超过整堆比IHOP阈值(默认45%),超过则进行混合收集
-XX:G1HeapWastePercent:堆废物百分比(默认5%)
垃圾回收(gc)算法无非都是给每一块分配的内存提供引橘芹用计数,然后通过智能指针(smart pointer)自动完成引用计数的加减,如果引用技术减少到零,就代表没有人使用该内存了,这块内存就可以回收了。garbage collector(gc)
如果可以正确的遵从这种gc的使用规则,也就是说你可以正确无误的使用智能指针,那么虚伍雹理论上来说,就不可能存在内存泄漏。
但是现实并不象想象的那么单纯,那么美好。一方面,智能指针的概念仍然没有被C++社区广泛的理解应用,而且智能指针种类繁多,各有各的规则,在代码量多了的时候,有时存在这样那样的失误难免;另一方面(应该是更加令人为难的一点),并不是所有人都那么喜欢用智能指针,而且原生指针的使用很多情形下避无可避,差帆我们不得不在原生指针与智能指针之间进行转换。
所以这样的gc的最终结果是,掌握引用计数的规则最终似乎比掌握new/delete的规则容易不了多少,有时甚至让新接触该技术的程序员感到畏惧。另外,引用计数的引入,出乎意料的产生了一个负作用:调试内存泄漏变得比原先困难多了。
所以引用计数和智能指针实现的gc不能从根本上解决内存泄漏问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)