阅读更多
JVM 堆分为 年轻代,年老代,持久代。
年轻代:产生和回收对象的区域,分为1个Eden和2个Survivor(from 和 to)。
年老代:生命周期较长的对象
持久代:类、方法等
JVM GC 机制
1. 对象总是产生于Eden.
2. 当Eden满时触发GC,将存活的对象复制到其中一个Survivor(from).将不存活的对象回收。
3. 当Survivor(from)满时,将survivor(from)中存活的对象复制到survivor(to)中。这时survivor(from)清空,变成survivor(to)。原survivor(to)变survivor(from)。可以看出survivor(to)永远保持空的。
4. Survivor(from) -> Survivor(to) 每迁移一次,年龄+1.
5. 当年龄达到 -XX:MaxTenuringThreshold 时, 将被移到年老代。
JVM参数
-Xmx:最大内存数
-Xms:初始内存数
-Xmn:年轻代大小
-Xss:每个线程堆栈大小
-XX:NewRatio: 年轻代与年老代比例 3表示(年轻代:年老代=1:3)
-XX:SurvivorRatio:单个survivor与Eden比例 3表示(survivor:Eden=2:3)
-XX:MaxPermSize:持久代大小
JVM 回收器 类型
1.串行回收器:只适合较少的数据。
-XX:+UseSerialGC
2.并行回收器:吞吐量优先。
-XX:+UseParallelGC(年轻代选择并行回收器)
-XX:+UseParallelOldGC(年老代选择并行回收器)
-XX:ParallelGCThreads=20(并行线程数,与处理器数目相等)
-XX:MaxGCPauseMillis=100(设置年轻代最长回收时间)
-XX:+UseAdaptiveSizePolicy(自动调整年轻代大小,以满足回收最长时间和频率)
3.并发回收器:响应时间优先。
-XX:+UseConcMarkSweepGC(年老代选择并发回收器)
-XX:+UseParNewGC(年轻代选择并发回收器)
-XX:CMSFullGCsBeforeCompaction(设置并发回收多少次后进行内存压缩整理)
-XX:+UseCMSCompactAtFullCollection(打开对年老代的压缩。可能会影响性能)
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
4.JVM GC 日志打印
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间
-XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息
-Xloggc:filename:记录日志文件