`
chen3975
  • 浏览: 6359 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入理解Java虚拟机:JVM高级特性与最佳实践之垃圾回收器及内存分配策略 -- 读书笔记

    博客分类:
  • java
阅读更多
1.根搜索算法:

Java通过根搜索算法(GC Roots Tracing)来确定对象是否存活,其基本算法是以"GC Roots"的对象为起点向下搜索,搜索所经过的路径为引用链,当一个对象与GC Roots没有任何引用链相连时便认为该对象是不可用的,可以收回.

2.垃圾器收集算法

2.1标记-清除算法(Mark-Sweep)
标记-清除算法分位两个步骤:标记和清除.首先通过跟搜索算法标记出那些对象不可用,然后统一将这些不可用的对象回收掉.
执行过程如下所示:

标记-清除算法具有两个缺点:一个是效率不高,另外一个是清除后存在大量的内容碎片.这样即使有足够的内存,但是由于内存碎片较多而导致无法为较大的对象分配内存,导致内存不足而不得不提前进行新的内存收集动作.

2.2复制算法
为了解决效率问题,采用复制算法(Copying).这种算法将内存分为相等的两块.每次只是用一块,当这块内存用完之后,就将还存活的对象复制到的另一块内存中,这样内存碎片化的情况就不存在了,只需将指针移到顶端按顺序分配内存即可.这个算法的不好一面就是内存大使用率只有50%.
复制算法的执行过程如下所示:



实际上,现在的商业虚拟机都将复制算法用在新生代中回收内存.但是由于在新生代中的98%对象都是朝生夕死的,存活的对象非常少,所以会将内存分成一块较大的内存Eden(伊甸)和两块相等的Survivor(生存).当回收内存时,会将Eden和一块Survivor存活的对象拷贝到另一块Survivor中.默认情况下他们按照8:1:1的比例进行划分,也即是新生代中可用的内存占90%.当然虚拟机无法保证每次只有不多于10%的对象存活,当Survivor内存不够用时,会需要依赖其他内存(老年代)进行分配担保(Handle Promotion).

2.3标记-整理算法(Mark-Compact)
复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低.更主要的是不想浪费50%的内存,就需要有额外的空间进行分配担保,以应对使用内存所有对象都100%存活的极端情况,所以一老年代一般不直接选用这种算法.根据老年代的特点,有人提出了标记-整理算法.标记过程和标记-清除算法一致,但后续过程不是将不可用对象清除掉,而是将存活对象向一边移动,然后将直接清除端边界外的内存.
标记-整理算法的执行过程如下图所示:



2.4分代收集算法
当前商业虚拟机都采用"分代收集(Generational Collection)算法",这种算法只是根据对象的存活周期不同将内存划分为几块,一般将Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适合的收集算法.在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集.而老年代中因为对象存活率高,没有额外空间对他进行分配担保,就必须使用"标记-清除"好"标记-整理"的收集算法.
  • 大小: 57.8 KB
  • 大小: 78.8 KB
  • 大小: 53.8 KB
分享到:
评论

相关推荐

    Java 虚拟机学习笔记:Java 内存区域,垃圾收集,内存分配与回收策略,JVM 调优,文件结构,类加载机制,Java 程序

    内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、...

    学习深入理解Java虚拟机的前几章笔记

    ### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...

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

    Java虚拟机(JVM)是Java程序运行的基础,它的历史发展和内存回收机制是Java开发者必须深入了解的关键领域。本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

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

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

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

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

    JVM 学习笔记(Java虚拟机)

    **JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...

    JVM内存空间分配笔记

    垃圾回收是JVM的一项重要特性,其主要目的是自动识别并回收不再使用的对象所占用的内存空间,从而避免内存泄漏。 - **回收策略**:从JVM方法栈和本地方法栈引出来的引用开始,把每一个引出来的引用作为根依次搜索...

    Java - JVM: 读书笔记 Chapter 05 The Java Virtual Machine ( Part I Basic )

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。在“Chapter 05 The Java Virtual Machine (Part I Basic)”这一章中,我们深入探讨了JVM的基础概念和工作原理。这包括JVM的内存区域...

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

    内存分配与回收是编程语言...总的来说,理解Java的内存分配与回收策略对于优化程序性能和避免内存问题至关重要。开发者应关注GC的工作原理,合理设置内存参数,并善用不同类型的引用,以实现更高效、更稳定的程序运行。

    马士兵jvm调优笔记.docx

    为了更好地控制Java虚拟机的行为,可以设置一系列JVM参数来优化性能。这些参数可以分为几类: - **标准参数**:所有JVM实现都支持的标准配置选项。 - **非标参数(-X)**:某些特定JVM实现提供的扩展配置选项。 - *...

    Java学习笔记_垃圾回收

    2. 垃圾回收器:Java虚拟机(JVM)包含一个或多个垃圾回收器,它们负责监测和回收不再使用的对象所占的内存。 二、垃圾回收的工作原理 1. 引用计数法:早期的垃圾收集算法,通过计算对象的引用次数来判断是否需要...

    ImagesForJVM-JVM笔记图片

    【标题】"ImagesForJVM-JVM笔记图片" 提供的是一系列关于Java虚拟机(JVM)的图像资料,这些图片通常用于辅助理解和学习JVM的工作原理。JVM是Java程序运行的基础,它负责解释执行Java字节码,使得Java能够实现跨平台...

    Java,JVM相关笔记的代码知识

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。这份JVM相关的笔记包含了深入理解JVM内部工作机制的关键代码资源,是学习和优化Java应用程序的重要参考资料。下面,我们将深入探讨...

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

    对于轻量级的对象,JVM可能会采用栈上分配(Stack Allocation)策略,直接在栈帧内创建对象,这样可以避免堆分配的开销,同时简化垃圾收集。这种技术在Java 9以后的版本中得到了进一步的应用,例如引入了“Value-...

    JVM笔记(阳哥).zip

    《JVM笔记(阳哥)》是一份深入探讨Java虚拟机(JVM)的资料,由阳哥精心整理。这份笔记涵盖了JVM的基础概念、内存管理、类加载机制、性能优化等多个方面,对于理解Java程序的运行机制以及提升开发效率具有重要的...

    java虚拟机知识点整理

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,并管理内存,确保程序的高效运行。以下是对Java虚拟机相关知识点的详细解析: 1. **虚拟机类型**: - **Sun公司的Hotspot VM**:它是Java社区...

    Java分布式应用学习笔记-谈JVM.doc

    【Java分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...

Global site tag (gtag.js) - Google Analytics