`
yinwufeng
  • 浏览: 289982 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MaxTenuringThreshold 参数

    博客分类:
  • JVM
 
阅读更多

MaxTenuringThreshold这个参数用于控制对象能经历多少次Minor GC才晋升到旧生代,默认值是15,那是不是意味着对象要经历15次minor gc才晋升到旧生代呢,来看下面的一个例子。

public class GCTenuringThreshold{
public static void main(String[] args) throws Exception{
GCMemoryObject object1=new GCMemoryObject(2);
GCMemoryObject object2=new GCMemoryObject(8);
GCMemoryObject object3=new GCMemoryObject(8);
GCMemoryObject object4=new GCMemoryObject(8);
object2=null;
object3=null;
GCMemoryObject object5=new GCMemoryObject(8);
Thread.sleep(4000);
object2=new GCMemoryObject(8);
object3=new GCMemoryObject(8);
object2=null;
object3=null;
object5=null;
GCMemoryObject object6=new GCMemoryObject(8);
Thread.sleep(5000);
}
}
class GCMemoryObject{
private byte[] bytes=null;
public GCMemoryObject(int multi){
bytes=new byte[1024*256*multi];
}
}

以-Xms20M –Xmx20M –Xmn10M –XX:+UseSerialGC参数执行以上代码,通过jstat -gcutil [pid] 1000 10的方式查看执行效果,很惊讶执行结果竟然是在第二次minor GC的时候object1就被晋升到old中了,而可以肯定的是这个时候to space空间是充足的,也就是说并不是在to space空间充足的情况下,对象一定要经历MaxTenuringThreshold次才会晋升到old,那具体规则到底是怎么样的呢,翻看Hotspot 6 update 21中SerialGC的实现,可以看到在每次minor GC后,会对这个存活周期的阈值做计算,计算的代码如下:

size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
size_t total = 0;
int age = 1;
assert(sizes[0] == 0, "no objects with age zero should be recorded");
while (age < table_size) {
total += sizes[age];
// check if including objects of age 'age' made us pass the desired
// size, if so 'age' is the new threshold
if (total > desired_survivor_size) break;
age++;
}
int result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;

其中desired_survivor_size是指survivor space/2,从上面的代码可看出,在计算存活周期这个阈值时,hotspot会遍历所有age的table,并对其所占用的大小进行累积,当累积的大小超过了survivor space的一半时,则以这个age作为新的存活周期阈值,最后取age和MaxTenuringThreshold中更小的一个值。

按照这样的规则,上面的运行效果就可验证了,第一次minor gc的时候存活周期的阈值为MaxTenuringThreshold,minor gc结束后计算出新的阈值为1,在第二次minor gc时object 1的age已经是1了,因此object1被晋升到了旧生代。

这个规则对于Serial GC以及ParNew GC(但对于开启了UseAdaptiveSizePolicy的ParNew GC而言也无效,默认是不开启的)均有效,对于PS(Parallel Scavenge) GC而言,在默认的情况下第一次以InitialTenuringThreshold(默认为7)为准,之后在每次minor GC后均会动态计算,规则比上面的复杂,后续再另写一篇blog来说,在设置-XX:-UseAdaptiveSizePolicy后,则以MaxTenuringThrehsold为准,并且不会重新计算,会是恒定值。

如希望跟踪每次minor GC后新的存活周期的阈值,可在启动参数上增加:-XX:+PrintTenuringDistribution,输出的信息中的:
Desired survivor size 1048576 bytes, new threshold 7 (max 15)
new threshold 7即标识新的存活周期的阈值为7。

分享到:
评论

相关推荐

    JVM参数调优及JAVA相关工具使用

    对象首先在Eden创建,经过一定次数的GC(由-XX:MaxTenuringThreshold参数控制)后晋升到年老代,这里通常使用标记整理算法。永久代存储类元数据,现代JVM(如Java 8及以上版本)使用元空间(Metaspace)代替。 Java...

    37-JVM优化1

    - 通过调整-XX:MaxTenuringThreshold参数,增加对象晋升到老年代的年龄,尽可能保持新生代的空间。 - 选择适合的垃圾收集器: - 串行收集器适用于低内存需求和后台计算任务。 - 并行收集器通过多线程提高垃圾...

    JVM基础知识及性能调优.pdf

    在年轻代中,对象首次创建时位于Eden区,经过一定次数的Minor GC(轻量级垃圾回收)后,仍存活的对象会被移动到Survivor区,当对象在Survivor区中达到一定年龄(通过MaxTenuringThreshold参数控制),就会被移动到老...

    从常用的垃圾回收到JVM相关调优.pdf

    当对象在Survivor区经历了足够多次的Minor GC后,年龄会增长,一旦达到某个阈值(可通过-XX:MaxTenuringThreshold参数设定),这些对象会被提升到老年代。当老年代内存不足时,会触发Full GC,清理老年代空间。 JVM...

    jvm 参数及gc详解

    - `-XX:MaxTenuringThreshold`: 设置对象晋升到老年代的阈值。 3. 非公开参数(-XX:) 这些参数通常用于实验或调试,如 `-XX:+UnlockExperimentalVMOptions` 可以解锁一些实验性的JVM特性。 二、Java垃圾收集...

    jvm 参数调优实践

    JVM参数调优是优化Java应用程序性能的关键环节,尤其是在服务器端的应用中,如Web服务器Resin。本实践案例中,作者分别尝试了三种不同的垃圾回收(GC)策略:串行回收、并行回收和并发回收,并针对每种策略提供了...

    jvm启动参数大全

    4. **-XX:MaxTenuringThreshold**: 设置对象从新生代晋升到老年代的最大年龄。默认值为15,表示对象在Survivor区最多经历15次垃圾收集后才会进入老年代。 5. **-XX:MetaspaceSize和-XX:MaxMetaspaceSize**: 分别...

    tomcat,oracle 参数优化

    - 其他参数如 `-XX:MaxTenuringThreshold` 和 `-XX:+UseCMSInitiatingOccupancyOnly` 用于调整垃圾回收的阈值和触发时机。 三、Tomcat容器自身的优化 除了JVM参数,还需要关注Tomcat服务器本身的配置,例如线程池...

    Java HotSpot虚拟机的部分参数翻译

    4. -XX:MaxTenuringThreshold:设置对象在新生代中最多存活的次数,超过这个次数会进入老年代。 5. -XX:TargetSurvivorRatio:设定Survivor空间期望的利用率,影响对象晋升策略。 6. -XX:+UseConcMarkSweepGC和-XX:+...

    虚拟机参数配置

    7. `-XX:MaxTenuringThreshold`:设定对象从年轻代晋升到年老代的最大年龄。如果设置为0,对象将直接进入年老代。 8. `-XX:PermSize`和`-XX:MaxPermSize`:设置持久代的初始和最大大小。在Java 8之后,持久代已被元...

    JVM 参数汇总.pdf

    6. **XX:MaxTenuringThreshold**: 定义对象在年轻代经历多少次垃圾回收后会被晋升到老年代。默认值为15,可调整以优化垃圾收集策略。 7. **XX:PretenureSizeThreshold**: 如果对象的大小超过这个阈值,它将直接进入...

    Java服务GC参数调优案例1

    使用参数 ‐XX:MaxTenuringThreshold=31 可以调整对象在年轻代内存中驻留的时间,但是实验后发现收效不明显。 在 CMS Remark 之前强制进行年轻代的 GC 时,我们需要理解 CMS 的相关知识。在 CMS 整个过程中,有两个...

    JAVA虚拟机性能参数调优指导书.doc

    - **GC调优参数的使用**:调整垃圾收集器参数,如-XX:MaxTenuringThreshold控制对象晋升老年代的阈值,-XX:GCTimeRatio设置垃圾收集时间占总运行时间的比例,可以减少停顿时间并提高吞吐量。 - **JIT调优参数的...

    java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf

    ### Java JVM 参数 `-Xms`、`-Xmx`、`-Xmn`、`-Xss` 调优总结 #### 一、概述 本文档主要介绍Java虚拟机(JVM)中四个重要的参数:`-Xms`、`-Xmx`、`-Xmn` 和 `-Xss` 的含义、作用以及如何通过这些参数来优化JVM的性能...

    如何配置jvm参数,调优

    ### 如何配置JVM参数,实现高效调优 在IT行业,Java虚拟机(JVM)作为执行Java程序的核心环境,其性能优化是确保应用程序稳定、高效运行的关键。本文将深入探讨如何合理配置JVM参数,以达到最优的系统表现。 #### ...

    JVM参数调优、垃圾回收算法及原理体系.docx

    Java虚拟机(JVM)参数调优是提升Java应用程序性能的关键环节,特别是在处理大量数据或高并发场景下。本文将详细解析JVM参数调优、垃圾回收(GC)算法及其原理,以帮助优化系统性能。 首先,对于JVM参数调优,有...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    还有像“-XX:MaxTenuringThreshold”用于设置对象晋升老年代的阈值,以及“-XX:PretenureSizeThreshold”设定大对象直接进入老年代的阈值。 此外,JVM的线程配置参数如“-Xss”设置每个线程的栈大小,对多线程应用...

    JVM参数-Xms-Xmx-Xmn-Xss-调优总结.docx

    `-XX:MaxTenuringThreshold` 控制对象晋升年老代的阈值,设为0表示对象直接进入年老代。 5. 垃圾收集器的选择: JVM提供了串行、并行和并发收集器。并行收集器(如`-XX:+UseParallelGC`)注重吞吐量,适合后台...

    Java虚拟机_JVM_参数配置

    4. **-XX:MaxTenuringThreshold**:设定对象晋升到老年代的阈值,超过这个次数的对象将直接进入老年代。 5. **-XX:CMSInitiatingOccupancyFraction**:CMS(Concurrent Mark Sweep)垃圾收集器的一个参数,表示当老...

    堆内存及JVM内存设置参数 小笔记

    4. **回收策略参数**:MaxTenuringThreshold(设置对象在Survivor区复制的次数,即对象的年龄阈值)、PrintTenuringDistribution(打印JVM每次Young GC后Survivor区对象的年龄分布)、NeverTenure(对象永远不会晋升...

Global site tag (gtag.js) - Google Analytics