`

《深入理解Java虚拟机》笔记之第3章 垃圾收集器与内存分配策略

阅读更多

1、判断对象是否存活的算法

   1)引用计数算法:对象中添加一个引用计数器,有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1。计数器的值为0的对象就是不可能再被使用的。(Python、微软的COM技术、Squirrel等使用此算法进行内存管理)。缺点在于难以解决对象之间的相互循环引用问题。

   2)根搜索算法:从一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。(JavaC#Lisp等使用此算法)

 

2、回收方法区(即HopSpot虚拟机中的永久代)

堆中(尤其是新生代中),常规应用进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。

永久代的垃圾收集主要加收两部分的内容:废弃常量和无用的类。

 

3、垃圾收集算法

1)标记-清除(Mark-Sweep)算法;

(2) 复制(Copying)算法:将内存要为大小相等的两块,每次只使用其中的一块,当这一块内存完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉(现代商业虚拟机都采用这种方式来回收新生代)。

新生代中的对象有98%是朝生夕死的,所以并不需要按照11的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor。当回收时,将EdenSurvivor中存活着的对象一次性地拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor的空间(Hotspot虚拟机默认EdenSurvivor的比例为81)。

3)标记-整理(Mark-Compact)算法:一般老年代采用。

一般而言,老年代GCMajor GC/Full GC)比新生代GCMinor GC)的速度慢10倍以上。

 

4、内存分配与回收策略

1)对象优先在Eden分配。如果Eden区没有足够的空间,虚拟机将发起一次Minor GC

2)大对象直接进入老年代。大对象是指需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串及数组。因此,写程序时应该“朝生夕死”的“短命大对象”。

3)长期存活的对象将进入老年代。对象在Eden出生,熬过一次Minor GC,其对象年龄就加1,默认对象年龄为15时,就会晋升到老年代。

4)动态年龄判定。如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

5)空间分配担保。Minor GC前,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小。如果大于,则改为直接进行一次Full GC;如果小于,则查看HandlePromotionFailure设置是否允许担保失败;如果允许,那只会进行Minor GC;如果不允许,则也要改为进行一次Full GC

 

 

分享到:
评论

相关推荐

    【Java正来-Java虚拟机专题】-Java垃圾收集器与内存分配策略

    主要整理内容为:分析了垃圾收集的算法和JDK1.7中提供的7款垃圾收集器的特点以及运作原理。以及内存分配策略

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益!  本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...

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

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

    深入理解Java虚拟机读书笔记之:第3章 安全(3)

    《深入理解Java虚拟机》是Java开发者必读的经典之作,其中第三章主要探讨了Java安全方面的内容。在Java中,安全是一个至关重要的概念,因为Java的设计目标之一就是提供一种可以在不同环境中安全运行的代码机制。本章...

    深入理解Java虚拟机JVM高级特性与最佳实践1

    《深入理解Java虚拟机JVM高级特性与最佳实践》是一本专注于Java开发人员提升技术水平的著作,由周志明撰写。这本书旨在填补Java技术体系中关于Java虚拟机(JVM)知识的空白,帮助读者深入理解JVM的工作原理及其对...

    深入java虚拟机 高清pdf 高清高清高清

    3. **垃圾收集与内存管理**:Java虚拟机中的垃圾收集机制是自动进行内存管理的关键。书里介绍了不同的垃圾收集算法(如标记-清除、复制、标记-整理、分代收集等)以及垃圾收集器(如Serial、ParNew、CMS、G1等),...

    深入理解Java虚拟机笔记(带目录).docx

    深入理解 Java 虚拟机笔记 Java 虚拟机(JVM)是 Java 语言的运行环境,它负责解释和执行 Java 字节码。下面是 Java 虚拟机相关的知识点: 虚拟机内存结构 Java 虚拟机的内存结构主要包括以下几个部分: * 方法...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...

    深入理解Java虚拟机(第二版)_java_

    《深入理解Java虚拟机(第二版)》还详细讨论了JVM的其他重要主题,如异常处理、反射、类加载器自定义、线程与同步、JVM调优工具的使用等。通过阅读本书,读者不仅可以深化对Java技术的理解,还能提升解决问题的能力...

    深入JAVA虚拟机 不那么完美的第二版.pdf.zip

    《深入JAVA虚拟机 不那么完美的第二版》这本书虽然在印刷上可能存在一些小瑕疵,但这并不影响我们从中汲取宝贵的Java虚拟机(JVM)知识。Java虚拟机是Java平台的核心组成部分,它负责执行Java程序,提供了跨平台的...

    深入理解Java虚拟机学习笔记借鉴.pdf

    第三步,内存空间初始化;第四步,必要的设置。对象的内存布局在 HotSpot 虚拟机中,对象在内存中存储的布局分为三块:对象头、实例数据和对齐填充。对象头包括两部分信息, 一部分用于存储对象自身的运行时数据,如...

    深入java虚拟机.pdf

    Java 虚拟机的垃圾收集是指在 Java 虚拟机中自动地回收不再使用的对象,以释放内存空间。垃圾收集可以是周期性的,也可以是根据需要进行的。Java 虚拟机提供了多种垃圾收集算法,如标记-清除算法、复制算法、标记-...

    深入理解java虚拟机视频教程

    深入理解java虚拟机视频教程,jvm原理,java虚拟机,jvm性能调优,内存模型,gc工作原理,内存分配,类的加载等等视频教程

    JAVA 垃圾收集器与内存分配策略.rar

    了解和掌握Java的垃圾收集器与内存分配策略对于开发高性能、稳定的应用至关重要,这涉及到程序的运行效率、内存消耗和避免内存泄漏等问题。通过理解这些概念,开发者可以更好地理解和解决Java应用程序中的内存问题,...

    深入理解Java 虚拟机内存模型.rar

    Java虚拟机(JVM)内存模型是Java...总的来说,深入理解Java虚拟机内存模型有助于我们更好地设计和优化Java应用程序,避免因内存问题导致的性能瓶颈或系统崩溃。通过学习和实践,我们可以编写出更高效、更稳定的代码。

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    理解内存分配、垃圾收集(GC)和内存泄漏对于优化程序性能至关重要。 4. **垃圾回收(GC)**:GC是Java的一大特性,它自动回收不再使用的对象所占用的内存。GC策略包括分代收集、标记-清除、复制算法、标记-整理等...

    深入java虚拟机笔记

    ### 深入Java虚拟机知识点总结 #### 第一章 Java体系结构介绍 - **Java体系结构概述**:本章主要介绍了Java体系结构的基本概念及其组成部分。Java体系结构旨在为开发者提供一个统一、高效且跨平台的应用开发环境。...

    深入理解JAVA虚拟机.xmind

    深入理解JAVA虚拟机.xmind

    深入JAVA虚拟机 随书源码 JVM规范

    GC策略包括分代收集、并行GC、并发GC和G1垃圾收集器等,每种策略都有其适用场景和优缺点。通过调整GC参数,我们可以优化应用程序的内存使用和性能。 总的来说,深入了解JVM不仅能够帮助我们编写出更高效的代码,还...

Global site tag (gtag.js) - Google Analytics