JVM进阶之GC(一)内存分代

前言

我们知道,java语言与c++语言最大的不同点就是在垃圾回收的处理上,java有了专门的垃圾自动回收机制,而c++需要手动回收内存垃圾。既然java的垃圾回收这么NB,那今天就来整理JVM的垃圾回收这块内容吧。

首先得明确几点目的: 
1. 为什么需要了解JVM的垃圾回收,让JVM自己去处理不就好了? 
2. 是回收什么东西? 
3. 是什么时候回收的? 
4. JVM是怎么进行垃圾回收的?

JVM内存分代策略

说GC之前先了解JVM的内存分代策略:

为什么要分代?

堆内存是虚拟机管理的内存中最大的一块,也是垃圾回收最频繁的一块区域。当然了,我们写的代码中new的对象等都存在堆内存中。 
如果说堆内存没有区域划分,所有新创建的对象和生命周期很长的对象放在一个区域,随着对象越来越多触发了JVM的垃圾回收机制,而每次回收都要遍历所有的对象,这个时间成本是难以想象的,严重影响GC效率。 
而有了内存分代,新创建的对象会在新生代中分配内存,而经过多次回收仍然存活下的对象或者有特殊情况的对象会移至老年代,类信息、静态变量等信息存放在永久代里。新生代中的对象存活时间短,只需要在新生代区域中频繁进行GC,而老年代中对象存活时间长,回收的频率相对就低很多了,永久代则很少进行垃圾回收。所以呢,给堆内存分代是为了提高对象内存分配和垃圾回收的效率。

JVM根据对象生命周期的不同,把堆内存划分出几块,一般是如图几块内容(本文讨论JDK1.8之前的版本,HotSpot虚拟机): 
内存分代

新生代

新生代也称Young区,eden区也称伊甸园(《圣经》中亚当和夏娃出生的地方),很形象的比喻对象的出生地点,全部的新生对象都会出现在eden区。s0和s1空间合称幸存者空间(Survivor Spaces),至于什么作用,后续介绍。 
新生代的绝大部分对象有朝生熄灭的特点,存活率很低,回收效率很高。

老年代

老年代也称Old区。老年代的对象是由新生代中存活多次,或者是特殊原因(原因有多种,后续介绍)从新生代直接转移来的。老年代中对象的生命周期较长,垃圾回收后对象存活率较高,但是回收的效率较慢。

永久代

永久代也称Permanent区或方法区。存储类信息、常量、静态变量以及即时编译器编译后的代码等等数据。相对而言,垃圾回收行为在这个区域是比较少出现的,但并非数据进入了永久代就如它的名字一样“永久”存在了,这片区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是必要的。

好了,由于GC的内容过多,本文为垃圾收回的区域以及对象所处的区域打下基础,咱们下篇继续。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值