JVM内存管理

划分:PC寄存器、虚拟机栈、本地方法栈(这三者都是线程独有,随线程销毁则释放,由虚拟机自身管理,无需垃圾管理),java堆,方法区,运行时常量池

java堆,方法区:自动内存管理,GC,full GC(new占用内存,GC释放内存)

其中java堆内存管理目前使用分代搜集算法新生代(Eden,S0,S1,内存占比8:1:1),老年代(存放在新生代多次GC(默认15次,可以配置)后任然存活的对象,或者内存大于新生代内存10%时,多余部分直接进入老年代:认为大对象生命周期一般比较长),永久代:方法区

 

一、什么时间GC,fullGC?

GC针对的是新生代,Eden 满了minor gc,升到老年代的对象大于老年代剩余空间full
gc,或者小于时被HandlePromotionFailure参数强制full

二、CG的对象是什么?

gc root根搜索时,搜索不到根的对象。root搜索不到的对象,或者经过第一次标记、清理后,仍然没有复活的对象。

新生代做的是复制清理、fromsurvivor、to survivor、老年代做的是标记清理、标记清理后碎片要整理、复制清理和标记清理有有什么优劣势等。

GC roots根集合:方法区中静态属性引用的对象,final声明的常量,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值

三、GC算法

1.标记-清理:有效内存耗尽时,启用GC,应用停止,利用GC roots算法进行根搜索标记,root可达的对象标记为活对象,再清理没有被标记的对象,再启动程序。结果是内存碎片

 

2.复制算法:复制算法将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的。当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。

它浪费了一半的内存,如果对象的存活率很高,我们可以极端一点,假设是100%存活,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变的不可忽视

 

3.标记-整理:

标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。

         整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。

标记/整理算法不仅可以弥补标记/清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价

标记/整理算法唯一的缺点就是效率也不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法。

 

4.性能对比:

 效率:复制算法>标记/整理算法>标记/清除算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。

 内存整齐度:复制算法=标记/整理算法>标记/清除算法。

 内存利用率:标记/整理算法=标记/清除算法>复制算法。

 

5.分代搜集算法

算法过程:

1. Eden+S0可分配新生对象;

2. 对Eden+S0进行垃圾收集,存活对象复制到S1。清理Eden+S0。一次新生代GC结束。

3. Eden+S1可分配新生对象;

4. 对Eden+S1进行垃圾收集,存活对象复制到S0。清理Eden+S1。二次新生代GC结束。

5. goto 1。

JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC),它们所针对的区域如下。

普通GC(minor GC):只针对新生代区域的GC。

全局GC(major GC orFull GC):针对年老代的GC,偶尔伴随对新生代的GC以及对永久代的GC。

由于年老代与永久代相对来说GC效果不好,而且二者的内存使用增长速度也慢,因此一般情况下,需要经过好几次普通GC,才会触发一次全局GC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值