博客
关于我
JVM初探(二):垃圾回收机制
阅读量:402 次
发布时间:2019-03-05

本文共 1542 字,大约阅读时间需要 5 分钟。

JVM垃圾回收机制详解

一、概述

自动的垃圾回收机制是Java语言的一大特点,它使开发者无需手动管理内存,从而避免了内存泄漏和内存碎片等问题。内存管理主要涉及内存的分配和回收,而Java虚拟机(JVM)通过分代算法实现内存的高效回收。

1.1 内存区域划分

Java堆(Heap)是垃圾回收的主要场所,主要存放对象实例。堆中分为新生代(Young Generation)和老年代(Old Generation)。新生代又分为三个部分:Eden区、Survivor区(Survivor0和Survivor1)。

  • Eden区:存放大多数短期对象,占比约为8/10。
  • Survivor区:存放经过一次垃圾回收后仍然存活的对象,用于降低内存碎片。
  • 老年代:存放存活时间长的对象,通常采用标记-整理算法进行回收。

1.2 垃圾回收时机

  • 新生代回收(Minor GC):频繁进行,采用复制算法。
  • 老年代回收(Full GC):较少进行,采用标记-整理算法。

二、对象可回收性判断

判断对象是否可回收是垃圾回收的关键步骤,主要使用引用计数算法和可达性分析算法。

2.1 引用计数算法

通过维护每个对象的引用数量,判断是否为0来决定是否回收。优点是实现简单且效率高,但无法处理循环引用问题。

2.2 可达性分析算法

通过从GC Roots出发,沿着引用链进行搜索,判断对象是否还能被其他对象引用。GC Roots包括:

  • 虚拟机栈中的引用对象
  • 方法区(Metaspace)中的静态属性引用
  • 方法区中的常量引用
  • 本地方法栈中的方法引用

2.3 强引用、软引用、弱引用、虚引用

为了应对不同内存需求,Java引入了四种引用:

  • 强引用:垃圾回收器不会回收。
  • 软引用:在内存不足时回收。
  • 弱引用:只能存活到垃圾回收前。
  • 虚引用:用于跟踪对象垃圾回收事件。

三、垃圾收集算法

垃圾收集算法主要包括标记清除、复制算法、标记-整理算法和分代收集算法。

3.1 标记清除算法

首先标记所有需要回收的对象,然后统一回收。优点是简单,缺点是效率低且内存碎片较多。

3.2 复制算法

将内存划分为两块,采用复制的方式进行垃圾回收。适用于新生代,效率较高。

3.3 标记-整理算法

将存活对象集中到一侧,清理另一侧的内存。适用于老年代,效率介于标记清除和复制算法之间。

3.4 分代收集算法

根据对象存活周期将堆划分为不同的代,并为每个代选择最适的收集算法。新生代采用复制算法,老年代采用标记-整理算法。

四、分代收集算法的内存回收策略

4.1 新生代和老年代

  • 新生代:主要存放短期对象,垃圾回收快,称为Minor GC。
  • 老年代:存放长期对象,垃圾回收较慢,称为Full GC。

4.2 内存分配策略

  • 对象优先分配给Eden区。
  • 大对象直接进入老年代。
  • 长期存活的对象进入老年代。
  • 使用动态年龄判定机制,分配到适当代。

五、垃圾收集器

Java提供了多种垃圾收集器,主要区分为新生代和老年代收集器。

5.1 Serial收集器

单线程新生代收集器,适合环境简单的场景。

5.2 ParNew收集器

多线程新生代收集器,性能比Serial收集器更好。

5.3 Serial Old收集器

多线程老年代收集器,适合老年代回收。

5.4 Parallel Scavenge收集器

多线程新生代收集器,注重系统吞吐量。

5.5 Parallel Old收集器

多线程老年代收集器,性能优于Serial Old收集器。

5.6 CMS收集器

多线程老年代收集器,以最短停顿时间为目标。

5.7 G1收集器

JDK7新增的收集器,支持整个堆的回收,适合多种环境。

通过以上内容,可以全面了解Java垃圾回收机制的实现原理和内存管理策略。

转载地址:http://tzmzz.baihongyu.com/

你可能感兴趣的文章
Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
查看>>
Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
查看>>
Openlayers实战:非4326,3857的投影
查看>>
Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
查看>>
Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
查看>>
Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
查看>>
Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
查看>>
Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
查看>>
Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
查看>>
Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
查看>>
Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
查看>>
Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
查看>>
Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
查看>>
Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
查看>>
Openlayers高级交互(2/20):清除所有图层的有效方法
查看>>
Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
查看>>
Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
查看>>
Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
查看>>
Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
查看>>
Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
查看>>