赞
踩
介绍在Java8中,运行时内存是如何工作的,对象的走向如何,Java7和Java8内存模型的变化又是什么?接下来让我给你解开谜团
基本组成如图:
其中新生代又分为Eden区、SurvivorFrom、SurvivorTo三个区,这么分的目的是因为年轻代采用的是复制算法进行垃圾回收。
主要存放对象在应用程序中生命周期长的内存对象
老年代对象不会像年轻代一样,朝生夕死,相对来说比较稳定,所有MajorGC不会频繁执行
有以下几种情况会触发MajorGC:
在java8之前,叫做永久区,由于其内存大小受限于java堆内存,随者Class的增多很容易触发OOM,因此在java8中做了调整,Metaspace位于本地堆内存(native heap),OOM问题不复存在,默认元数据区内存大小只受本地内存大小的限制,也就是说本地内存多大,Metaspace就可以有多大
元空间的出现就是为了解决突出的类和类加载器元数据过多导致的OOM问题
PermGen与Metaspace的对比:
PermGen(老年代) | Metaspace(元数据区) |
---|---|
它已从Java 8中删除 | 它是在Java 8中引入的 |
静态变量和常量池在方法去 | 常量池、静态成员变量等迁移到了堆中 |
PermGen始终具有固定的最大大小 | 默认情况下,元空间会根据基础操作系统自动增加其大小 |
连续的Java堆内存 | 本地内存(由底层操作系统提供) |
没有效率的垃圾收集 | 高效的垃圾收集 |
有什么问题欢迎大家指正~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。