欧博注册:工具建立与堆

admin 3个月前 (06-23) 科技 28 0

这一节主要先容工具建立时,在堆中的一些历程。

回忆下,我们之前说的,什么时刻会发生垃圾接纳?

除了在一些平安点处也许会发生垃圾接纳(只是也许),若是在所需内存不足的情况下,一定会发生垃圾接纳。

分配堆空间

首先通过设置参数,把堆空间设置为 20M,其中 新生代 10M,暮年月 10M。

参数设置:

-Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails

效果为:

Heap
 PSYoungGen      total 9216K, used 1685K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 8192K, 20% used [0x00000007bf600000,0x00000007bf7a5580,0x00000007bfe00000)
  from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
  to   space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)
 ParOldGen       total 10240K, used 0K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  object space 10240K, 0% used [0x00000007bec00000,0x00000007bec00000,0x00000007bf600000)

建立一个新工具

我们首先建立一个工具,这个工具占用 2M 的空间。

package heap;

public class CreateObject {
    public static void main(String[] args) {
        byte[] obj1 = new byte[1024 * 1024 * 2];
    }
}

最后的输出:

Heap
 PSYoungGen      total 9216K, used 3733K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 8192K, 45% used [0x00000007bf600000,0x00000007bf9a5590,0x00000007bfe00000)
  from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
  to   space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)
 ParOldGen       total 10240K, used 0K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  object space 10240K, 0% used [0x00000007bec00000,0x00000007bec00000,0x00000007bf600000)

可以看到,新生代 被占用了,暮年月占用为 0K,没有被使用。

以是,new 的工具先放在 eden 区。

填满 eden 区

在填满 eden 区后,会发生什么呢?由于 survivor 区实在太小了,很难看到。以是,这里可以借助 Visual VM,来考察,加倍直观。

程序如下:

package heap;

public class CreateObject {
    public static void main(String[] args) {
        while(true){
            byte[] bytes = new byte[1024 * 512];
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

重点是看右边的纪录图。注重,这里我们将每次建立工具的巨细设置为了 0.5M。

当 Eden 满的时刻,会挪用垃圾接纳器,挪用垃圾接纳器后,Eden 泛起了低谷,Survivor 泛起了一个增进。暮年区也泛起了一个增进。

当 Eden 满的时刻,若是 Survivor 区有足够的空间容纳存活工具,那么可以把存活工具放入 Survivor,多的工具放入暮年区。

现在,我们把工具的巨细调大。设置为 2M,这样 Survivor 就无法存放下。

可以看到,在经由一次垃圾接纳的时刻(可以看到GC Time 上有波峰,说明执行了一次垃圾接纳),但我们注重到,Survivor 区中并没有被占用。说明垃圾接纳历程中,直接将存活工具放到了暮年月中。

再来聊聊 survivor 区

工具通常在 Eden 区里降生,若是经由第一次 Minor GC 后仍然存活,而且能够被 Survivor 容纳的话,该工具会被移动到 Survivor 区,而且将其岁数设置为 1 岁。工具在 Survivor 区每熬过一次 Minor GC,岁数就增添 1 岁,当它岁数增大到一定水平(默认是 15 岁),就会被提升到暮年月。

特殊情况

有些时刻,若是用户建立了大工具,如很长的字符串或者元素许多的数组的时刻。这种大工具都占用大量的内存,像这种大工具,有很大概率是长时间使用的,否则为什么要建立大工具。

若是大工具朝生夕灭,我们知道在 JAVa 8 中,新生代默认接纳的 符号-复制 算法,那么对于大工具而言,是异常耗时的。

以是,若是 JVM 设置了一个阈值,那么当分配的工具大于这个阈值的时刻,会直接被分配到暮年月。

总结

,

www.allbetgaming.net

欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:欧博注册:工具建立与堆

标签列表

    文章归档

      站点信息

      • 文章总数:339
      • 页面总数:0
      • 分类总数:8
      • 标签总数:658
      • 评论总数:54
      • 浏览总数:1369