首页 技术 正文
技术 2022年11月16日
0 收藏 501 点赞 4,104 浏览 1091 个字

根据对象的存活率(年龄)Java堆内存划分为3种,新生代,老年代,永久代;

1.新生代

比如我们在方法中区new一个对象,那这方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。

现在的商业虚拟机都采用这种手机算法来回收新生代,新生代中的对象98%都是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块比较小的Survivor空间,每次使用Eden和其中一块Survivor。当会收拾,将Eden和Survivor中还存活的对象一次性放复制到另一块Survivor空间上,最后清理到Eden和刚才用过的Survivor空间,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%)只有10%的空间会被浪费。

当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖于老年代进行分配担保,所以大对象直接进入老年代。同事,长期存活的对象将进入老年代(虚拟机给每隔对象定义一个年龄计数器)。

来看下面一张图

Java堆内存划分

Minor GC和Full GC

Minor GC:

Minor GC是发生在新生代中的垃圾收集动作,采用的是复制算法。

对象在Eden和From区出生后,在经过一次Minor GC后,如果对象还存活,并且能够被to区所收容,那么在使用复制算法时这些存活的对象就会被复制到to区域,然后清理掉Eden区域和from区域,并将这些对象的年龄设置为1,以后对象在Survivor区域每熬过一次MinorGC,就将对象的年龄加1,当对象的年龄到达某个值时(默认是15岁,可以通过-xx:maxtenuring threshold设置),这些对象就会成为老年代。

但是这也是不一定的,对于一些较大的对象(即需要分配一块较大的拦蓄内存空间)则是直接进入老年代。

Full GC:

Full GC是发生在老年代的来及回收收集动作,采用的是标记-清除、清理算法。

老年代里的对象几乎是在Survivor区熬过啦的,不会那么容易死掉。因为Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比做一次Minor GC的时间长。

另外,如果采用的是标记清除算法的话为产生讯多碎片,伺候如果需要为较大的对象分配内存时,若无法找到足够的连续的内存空间,就会提前出发一次GC。

2.老年代

在新生代中经理了N次垃圾回收后任然存货的对象就会被放到老年代中。而且大对象直接进入老年代。

3.永久代

即方法区。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,077
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,552
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,401
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,813
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,896