JVM-048-垃圾回收-相关概念的概述-在谈引用

引入

我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。

在JDK1.2版之后,Java对引用的概念进行了扩充,将引用分为:

  • 强引用(Strong Reference)
  • 软引用(Soft Reference)
  • 弱引用(Weak Reference)
  • 虚引用(Phantom Reference)

这4种引用强度依次逐渐减弱。

除强引用外,其他3种引用均可以在java.lang.ref包中找到它们的身影。如下图,显示了这3种引用类型对应的类,开发人员可以在应用程序中直接使用它们。

阅读更多

JVM-047-垃圾回收-相关概念的概述-安全点与安全区域

安全点(Safepoint)

概念

程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint)”。

Safe Point的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择一些执行时间较长的指令作为Safe Point,如方法调用、循环跳转和异常跳转等。

阅读更多

JVM-046-垃圾回收-相关概念的概述-并行与并发

程序的并发与并行

并发(Concurrent)

概念

  • 在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行

  • 并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换。由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行

阅读更多

JVM-044-垃圾回收-相关概念的概述-内存溢出与内存泄漏

内存溢出(OutOfMemoryError)

概念

  • 内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。

  • 由于GC一直在发展,所以一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现OOM的情况。

  • 大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的Full GC操作,这时候会回收大量的内存,供应用程序继续使用。

  • Javadoc中对OutofMemoryError的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。

阅读更多

JVM-043-垃圾回收-相关概念的概述-System.gc()的理解

概念

  • 在默认情况下,通过System.gc()Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。

  • 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)

  • JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基本测试,我们可以在运行之间调用System.gc()。

阅读更多

JVM-042-垃圾回收-相关算法-算法使用方式

没有最好的算法,只有最合适的算法

分代收集算法(Generational Collecting)

引入

前面所有这些算法中,并没有一种算法可以完全替代其他算法,它们都具有自己独特的优势和特点。分代收集算法应运而生。分代的思想被现有的虚拟机广泛使用。几乎所有的垃圾回收器都区分新生代和老年代。

阅读更多

JVM-041-垃圾回收-相关算法-清除阶段

引入

当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配内存。目前在JVM中比较常见的三种垃圾收集算法是

  1. 标记-清除算法(Mark-Sweep)
  2. 复制算法(Copying)
  3. 标记-压缩算法(Mark-Compact)
阅读更多

JVM-040-垃圾回收-MAT与JProfiler的GC Roots溯源

MAT 介绍

  1. MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器。用于查找内存泄漏以及查看内存消耗情况。
  2. MAT是基于Eclipse开发的,是一款免费的性能分析工具。
  3. 可以在http://www.eclipse.org/mat 下载并使用MAT

为了实时分析GC Roots是哪些东西,中间需要用到一个dump的文件

阅读更多

JVM-039-垃圾回收-对象的finalization机制

概述

  1. Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑
  2. 当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法。
  3. finalize() 方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。
阅读更多