java 测试发生minorGC的时候,如果不能将所有存活的对象拷贝到要区域,那么就会将无法放到为了区域的对象直接晋升到老年代,而那些可以在为区域放得下的对象还是呆在要区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 测试发生minorGC的时候,如果不能将所有存活的对象拷贝到要区域,那么就会将无法放到为了区域的对象直接晋升到老年代,而那些可以在为区域放得下的对象还是呆在要区相关的知识,希望对你有一定的参考价值。

package org.hujian.jvm.gc;

import org.hujian.common.JvmTestRunner;

/**
 * Created on 2018/11/8 17:26.
 * JVM Arg:
 *  -XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -Xms200m -Xmx200m -Xmn100m
 */
public class TestNotEnoughSpaceOnToWhileMinorGC extends JvmTestRunner {
    /**
     * 在这里实现测试逻辑,不提供参数列表以及返回值,执行该方法应该测试到
     * 你需要实现的所有逻辑,本方法单线程执行(main)
     */
    @Override
    protected void execute() {
        //testCanCopyTo();
        testCannotCopyTo();
    }

    /**
     * 测试可以拷贝到To区域的情况
     *
     */
    private void testCanCopyTo() {

        /// 申请5M大小的对象,这个对象需要存活
        b1 = allocMb(5);

        /// 接下来试图触发一次minorGC
        allocMb(20);
        allocMb(20);
        allocMb(20);
        allocMb(20);

        reportData();
    }

    /**
     *  测试无法拷贝到To区域的情况
     *
     */
    private void testCannotCopyTo() {
        /// 测试在minorGC发生的时候,如果存活的对象大小大于to区域的大小,是否会将对象直接晋升到老年代

        b1 = allocMb(8);
        b2 = allocMb(20);

        allocMb(20);
        allocMb(20);
        allocMb(20);

        reportData();
    }

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

以上是关于java 测试发生minorGC的时候,如果不能将所有存活的对象拷贝到要区域,那么就会将无法放到为了区域的对象直接晋升到老年代,而那些可以在为区域放得下的对象还是呆在要区的主要内容,如果未能解决你的问题,请参考以下文章

Java 内存管理机制:04 Java 内存分配策略

JVM内存分配与回收策略

4.内存分配

JVM垃圾回收的四大算法

JVM垃圾回收的四大算法

java垃圾回收GC