java 测试长期存活的对象将晋升到老年代

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 测试长期存活的对象将晋升到老年代相关的知识,希望对你有一定的参考价值。

package org.hujian.jvm.gc;

import org.hujian.common.JVMMemoryUnit;
import org.hujian.common.JvmTestRunner;

/**
 * Created on 2018/11/6 23:13.
 * JVM Arg:
 *  -verbose:gc -XX:+PrintGCDetails -Xms200m -Xmx200m -Xmn100m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:+PrintTenuringDistribution
 */
public class TestTenuringThreshold extends JvmTestRunner {
    /**
     * 在这里实现测试逻辑,不提供参数列表以及返回值,执行该方法应该测试到
     * 你需要实现的所有逻辑,本方法单线程执行(main)
     */
    @SuppressWarnings("unused")
    @Override
    protected void execute() {

        /// 测试长期存活的对象将晋升到老年代
        /// 可以使用:-XX:MaxTenuringThreshold来设置对象从年轻代晋升到老年代的age阈值
        byte[] data1, data2, data3, data4;

        //// 构造age1,Eden有8M,Eden区域无法申请到足够的空间的时候会进行一次MinorGC
        //// 为了不让对象直接晋升到老年代,需要存活的对象能复制到to区域

        data1 = JVMMemoryUnit.MB.alloc(3); // 让这个对象一直存活,看age到达MaxTenuringThreshold的时候是否成功晋升到老年代

        /// ok,现在Eden区域我们已知的对象大小为8M,剩下70M左右,试试能不能申请到
        JVMMemoryUnit.MB.alloc(76);
        JVMMemoryUnit.MB.alloc(76);
        JVMMemoryUnit.MB.alloc(76);

        System.out.println(data1.length);
    }

    public static void main(String[] args) {
        new TestTenuringThreshold().execute();
    }
}

以上是关于java 测试长期存活的对象将晋升到老年代的主要内容,如果未能解决你的问题,请参考以下文章

java对象从新生代晋升到老年代的四种方式

java对象从新生代晋升到老年代的四种方式

java 测试对象动态判断是否需要晋升到老年代

JVM内存分配策略

GC新生代对象晋升到老年代情况总结

收藏: