`

《JVM笔记》之二:垃圾收集器与内存分配策略

    博客分类:
  • Java
阅读更多

引用计数算法:

判定一个对象是否还存活,一个比较简单的算法就是引用计数算法。比较著名案例就是微软的COM技术、使用ActionScript 3的FlashPlayer、Python语言以及游戏脚本中的Squirrel都利用这个算法进行内存管理。但是Java中并没有使用这项技术,主要原因是循环引用问题。

 

根搜索算法:

在主流的商用程序语言中,包括Java、C#、Lisp等都使用的是根搜索算法 GC Root Tracing判定对象是否存活。任何对象到GC Roots的路径不可达的时候就认定需要回收了,而不管它们之间的循环引用。

在Java中,可作为GC Roots的对象包括下面几种:

* 虚拟机栈(栈帧中的本地变量表)中的引用的对象

* 方法区中的static属性引用的对象

* 方法区中final引用的对象

本地方法栈中JNI的引用的对象

 

Java的引用分为四种,从强到弱依次为:

* 强引用 Strong Reference:

  强引用是程序代码中普遍存在的,类似 Object ojb = new Object()的引用,只要强引用存在,垃圾收集器永远都不会回收掉被引用的对象。

* 软引用 Soft Reference:

  软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收,如果这次回收还是没有足够的内存,才会抛出内存溢出异常。提供了SoftReference类来实现软引用。

* 弱引用 Weak Reference:

  弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。提供了WeakReference类来实现弱引用。

* 虚引用 Phantom Reference

  虚引用也称为幽灵引用或者幻引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是希望这个对象被GC回收时收到一个系统通知。提供PhantomReference类实现虚引用。

 

对象有一个finalize()方法,是对象逃脱死亡命运的最后一次机会,如果对象在finalize将自己赋给任何一个引用链里面的对象相关联,那么又活了。哈哈。 但是所有对象的这个方法只能被系统调用一次,也就是只有一次机会去拯救自己。这个方法最好别用,谢谢。

 

内存回收算法:

1,标记-清除 算法  Mark-Sweep

最基本的算法,效率很低

2,复制算法

将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。回收时,将Eden和Survivor中还存活的对象一次性copy到另一个Survivor空间,然后清理掉Eden和刚用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor比例是8:1. 不够的时候会有分配担保来保证。

3,标记-整理 算法:

跟标记-清除算法类似,只是标记后先让所有存活对象前面移动,然后一次性清理最后的区域。

4,分代收集算法

当代商业虚拟机的垃圾收集都采用分代收集 Generational Collection算法。

新生代中采用复制算法,因为这里面对象更新换代很快。

老年代采用标记-整理 算法。

 

新生代的Minor GC示例:

/**
 * VM参数: -verbose:gc -Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8 -XX:+PrintGCDetails
 * @author Administrator
 *
 */
public class MinorGC {
	private static final int _1MB = 1024 * 1024;
	public static void main(String[] args) {
		byte[] a1, a2, a3, a4;
		a1 = new byte[2 * _1MB];
		a2 = new byte[2 * _1MB];
		a3 = new byte[2 * _1MB];
		a4 = new byte[4 * _1MB]; // 出现一次Minor GC

	}
}

 

本人博客已搬家,新地址为:http://www.pycoding.com/

分享到:
评论

相关推荐

    笔记,2、垃圾回收器和内存分配策略3

    《垃圾回收器与内存分配策略详解》 在Java编程中,理解垃圾回收(Garbage Collection,简称GC)机制和内存分配策略是至关重要的。GC的主要目的是自动管理内存,避免程序员手动进行繁琐且容易出错的内存释放工作。而...

    笔记,2、垃圾回收器和内存分配策略1

    《垃圾回收器与内存分配策略详解》 在Java编程中,理解垃圾回收(Garbage Collection,简称GC)机制和内存分配策略是至关重要的。GC的主要目的是自动管理内存,避免程序员手动进行繁琐且容易出错的内存释放工作。而...

    JVM内存空间分配笔记

    - 分析垃圾收集器的行为。 - 避免不必要的对象创建。 - 优化算法和数据结构。 #### 九、类的封装与继承 类的设计在Java开发中至关重要。良好的封装不仅可以提升代码的安全性,还可以提高代码的可维护性和可扩展...

    马士兵jvm调优笔记.docx

    #### 二、垃圾收集算法 垃圾收集算法主要用于释放那些不再使用的对象所占用的内存,从而避免内存泄漏问题。主要包括以下几种: - **标记-清除算法**(Mark-Sweep):首先标记所有需要回收的对象,然后统一回收这些...

    JVM笔记(阳哥).zip

    通过调整JVM参数,如-Xms、-Xmx、-XX:NewRatio等,可以优化内存分配策略,减少垃圾收集频率,提高程序运行效率。此外,理解JIT(Just-In-Time)编译器的作用,以及如何利用-XX:CompileThreshold等参数,也能进一步...

    JVM历史发展和内存回收笔记

    9. **Java 17与飞行记录器**:2021年的Java 17,JDK提供了飞行记录器(Flight Recorder),用于收集JVM内部的诊断数据,帮助开发者分析性能问题。 二、JVM内存回收机制 1. **堆内存**:所有对象都在堆内存中分配,...

    ImagesForJVM-JVM笔记图片

    3. **垃圾收集**:JVM自动管理内存,通过垃圾收集器(Garbage Collector)回收不再使用的对象,防止内存泄漏。常见的垃圾收集算法有标记-清除、复制、标记-整理和分代收集等。 4. **运行时数据区**:JVM内存可以...

    JVM历史发展和内存回收笔记.rar

    4. **堆**:所有对象实例和数组都在堆中分配内存,是所有线程共享的一块区域,通过垃圾收集器进行内存管理。 5. **方法区**:存储类和接口的信息,如常量池、字段和方法数据。在Java 8后被元空间(Metaspace)所取代...

    JVM内存管理学习笔记

    Java的垃圾收集器负责自动回收不再使用的对象所占用的内存,避免内存泄漏。主要的垃圾收集算法包括: 1. 标记-清除算法:首先标记出所有需要回收的对象,然后统一清除。缺点是容易产生大量碎片。 2. 复制算法:将...

    JVM工作原理学习笔记

    此外,JVM还提供了垃圾收集器,如Serial、Parallel、CMS和G1等,它们有不同的性能特性和适用场景。 JVM的性能优化主要关注以下几个方面:内存调优,如调整堆大小、新生代与老年代的比例;类加载优化,避免类的频繁...

    JVM内存结构笔记.rar

    不同的垃圾收集器如Serial、Parallel、Concurrent Mark Sweep (CMS) 和 G1,有不同的工作策略和性能特点。 JVM内存调优包括设置合适的堆大小、新生代与老年代的比例、设置GC策略等。例如,通过 `-Xms` 和 `-Xmx` ...

    JVM 学习笔记(Java虚拟机)

    - 垃圾收集器:如Serial、ParNew、Parallel Scavenge、CMS、G1等,用于自动回收不再使用的对象所占用的内存。 - 垃圾收集算法:标记-清除、复制、标记-整理和分代收集。 - 内存晋升策略:对象在新生代经过多次 ...

    笔记,2、内存分配与回收策略~深入理解垃圾回收器1

    垃圾收集算法中,复制算法是一种简单高效的策略,它将内存分为两等份,每次只使用一半,存活对象在回收时被复制到另一半,然后清空已使用的一半。在Java的新生代内存管理中,采用类似的分代策略,但内存划分不是精确...

    学习jvm笔记.zip

    1. 参数调优:通过调整JVM启动参数,如-Xms、-Xmx设定堆大小,-XX:+UseConcMarkSweepGC选择垃圾收集器等,来优化JVM性能。 2. 编程实践:减少对象创建,避免大量短生命周期的对象,使用StringBuilder代替String拼接...

    jvm学习笔记

    这篇笔记将深入探讨JVM的工作原理、内存管理、类加载机制以及优化策略,帮助读者全面理解JVM并提升Java程序的性能。 一、JVM概述 Java虚拟机作为一个抽象的计算机,它具有指令集、硬件架构和操作系统,使得Java...

    jvm原理分析课程笔记

    不同的垃圾收集器有不同的工作策略,如新生代GC、老年代GC,以及分代收集等。理解GC的工作原理,能帮助我们调整参数以提高应用的响应速度和内存利用率。 JVM的字节码执行引擎(也称为解释器)是Java代码运行的基础...

    笔记-JVM三期.pdf

    JVM的性能调优主要包括内存管理和垃圾收集(GC)优化。内存优化涉及合理设置堆大小、新生代和老年代的比例,避免内存溢出。GC优化则关注垃圾收集的效率,通过调整GC算法、设置GC参数来减少停顿时间和提高系统响应...

    eclipse性能优化 <深度理解jvm>读书笔记

    理解不同类型的垃圾收集器,如Serial、Parallel、CMS、G1等,以及它们的工作机制,可以帮助我们选择适合应用的GC策略,减少内存瓶颈。 3. **对象生命周期**:了解对象从创建到消亡的过程,包括新生代、老年代的划分...

    JVM性能学习笔记思维导图

    本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...

Global site tag (gtag.js) - Google Analytics