JVM 垃圾回收

本文详细探讨了JVM内存分配策略,包括指针碰撞和空闲列表,并介绍了各种垃圾回收算法如Mark-Sweep和Mark-Compact。重点讨论了新生代和老年代的收集器,如Serial、Parallel Scavenge、CMS和G1,强调了它们的特点和适用场景,特别是G1的可预测停顿时间模型和Region内存布局。
摘要由CSDN通过智能技术生成

JVM 内存分配方式

指针碰撞(Bump the Point)、空闲列表(Free List)。

指针碰撞

对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump thePointer)。

使用这种分配算法的垃圾收集器是Serial,ParNew等带有内存整理的垃圾收集器。

空闲列表

如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(FreeList)

采用标记-清除算法的垃圾收集器(eg:CMS)会采用这种分配方式。但是这种分配方式很容易造成很多外部碎片,在一定程度上会造成内存的浪费。

内存分配策略

1.对象优先在新生代中分配

新生代分为Eden区和Survivor区,大小比例通常为8:1,新对象一般在Eden区进行分配,当Eden区已满时,虚拟机会发起一次GC,将Eden区还存活的对象移动至Survivor区,并一次性清扫Eden区。

2.大对象直接进入老年代

所谓的大对象是指需要大量连续内存空间的对象,比如说很长的字符串或者数组。经常出现大对象容易导致内存还有不少空间时就要进行gc,以获取足够空间来存放它们。

3.长期存活的对象将进入老年代

如果对象在Eden区出生,并能够顺利熬过第一次gc,且能被Survivor区容纳的话,那么将被移动到Survivor区,并初始化年龄为1岁,以后每熬过一次gc,年龄就加一次,当年龄增加到一定程度(默认15),就会晋升到老年代中。

垃圾回收算法

Mark-Sweep算法

标记-清除(Mark-Sweep)算法是通过可以回收的内存进行标记后做清除操作,这样做的缺点就是会产生很多的内存碎片,可能的结果就是空闲内存总量是能够进行新对象的分配的,但是由于这些空闲的空间都不连续,一个对象放不下。就必须进行另外一次垃圾回收,垃圾回收又会引起服务的暂时停顿。

Mark-Compact 算法

标记-整理(Mark-Compact)算法解决了标记-清除(Mark-Sweep)算法会产生很多不连续的空闲空间做出了改进,具体的方法就是在进行标记之后不是将对象直接清理掉,而是将存活的对象进行整理,使得存活的对象占用一块连续的内存空间,因为存活对象和可回收空间有明显的分割,所以可以直接对边界之外的内存进行直接的清理。这样的清理无疑更加有效率,虽然增加了移动对象的开支,但是整体上会比标记-清除(Mark-Sweep)算法更有效率。

Copying 算法

复制(Copying)算法将内存区域分为大小相同的两个区域,当需要内存回收的时候,只需要将存活的对象复制到另外一块空闲区域,然后将原来的区域一次清理干净,什么都不留。相较于标记-清除(Mark-Sweep)算法的优势就是在解决了在标记和清除阶段的低效率和内存碎片问题,相较于标记-整理(Mark-Compact)算法的优势则是有着固定的内存分割线,而不是动态的调整,同时由于有两块相同大小的内存区域,存活的对象的复制和内存的回收会更有效率。缺点也十分明显,就是需要的内存空间是可用空间的2倍,内存的使用率永远不会超过50%。

判断对象是否存活

1. 引用计数法

给对象添加一个计数器,当有一个地方引用它时计算器加1,当应用失效计算器减1,计算器为0时表示可回收。目前主流Java虚拟机并没有采用该方法,因其无法解决相互循环应用的问题。

2. 可达性分析算法

该算法基本思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值