`
不平凡的人
  • 浏览: 35996 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

JVM垃圾回收算法

 
阅读更多

本文简单介绍一下垃圾回收的概念及算法

 

一、垃圾回收算法

二、垃圾回收停顿现象

三、对象如何进入老年代

四、TLAB区域

 

 

一、垃圾回收算法

 

垃圾回收(Garbage collection,简称GC),类比生活中的垃圾,会把垃圾丢入垃圾桶中,然后清理掉。GC中的垃圾特指存入内存中、不会再被使用的对象,而回收相当于将垃圾倒掉。

垃圾回收算法有很多种:

①引用计数算法

②标记压缩算法

③复制算法

④分代、分区思想

 

1、引用计数法

比较古老经典的算法,其核心是在对象被其他所引用时计数器加1,而引用失效时则减1。但是这种方式有非常严重的问题:无法处理循环引用的情况,每次进行计数的加减操作比较浪费性能。

 

2、标记清除算法

分为标记和清除两个阶段对内存中的对象进行处理。

该种方式的弊端:空间碎片问题,垃圾回收后空间是不连续的,不连续的内存空间工作效率要低于连续的内存空间。

 

3、复制算法(堆中年轻代垃圾回收)

 核心思想将内存空间分为两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存块中,之后清除之前正在使用的内存块中所有对象,反复交换两个内存的角色,完成垃圾收集。(java新生代中from,to空间使用这种算法)

 

4、标记压缩算法

标记压缩算法是在标记清除算法的基础上做了优化,把存活的对象压缩到内存的一端,而后进行垃圾清理。(堆中老年代使用标记压缩算法)

 

问题:为什么新生代与老年代使用不同的算法?

新生代对象生命周期比较短需要频繁进行GC,而老年代对象声明周期较长,GC次数多会影响性能。

 

5、分代算法

就是根据对象的特点将内存分为N块,而后根据每个内存的特点使用不同的算法。

对于新生代与老年代来说,新生代回收的频率比较高,而每次回收耗时较短,而老年代回收频率较低,但是耗时会相对较长,所以应该尽量减少老年代的GC。

 

6、分区算法

其主要将内存分为N多个小的内存空间,每个小空间都可以独立使用,这样可以细粒度的控制回收的内存空间,而不需要对整个空间进行GC,从而提升性能,并减少GC的停顿时间。(可以类比Hashtable与ConcurrentHashMap)。

 

二、垃圾回收停顿现象

垃圾回收器的任务是识别和回收垃圾对象进行内存清理。为了让垃圾回收器高效执行,大部分情况下,会要求系统进入一个停顿的状态。停顿的目的是终止所有的应用线程。这样系统才不会有新的垃圾产生,同时停顿保证了系统状态在某一瞬间的一致性,便于更好的标记垃圾对象。因此,在垃圾回收时,都会产生应用程序的停顿。

 

 

三、对象如何进入老年代

一般而言,对象首次创建都会被放置在新生代的eden区,如果没有GC的介入,该对象会一直存在eden区。

 

对象如何进入老年代?

如果对象达到一定的年龄大小,就会自动离开年轻代进入老年代。对象的年龄由经受GC的次数决定,在新生代每次GC之后如果对象没有被回收则年龄加1。

 

虚拟机提供一个参数来控制新生代对象的最大年龄,当超过这个年龄则会晋升到老年代。

 

-XX:MaxTenuringThreshold,默认情况下为15。

根据-XX:MaxTenuringThreshold参数,可以指定新生代对象经过多少次回收进入老年代。

 

另外,对于大对象(新生成代eden区无法直接载入时,直接进入老年代)。JVM中有参数可以设置对象的大小超过指定的大小之后直接进入老年代。

 

-XX:PretenureSizeThreshold 参数设置对象大小超过改参数后进入老年代。

 

注意:-XX:PretenureSizeThreshold可以指定进入老年代对象的大小,但是要注意TLAB区域优先分配空间。

 

四、TLAB区域

 

TLAB全称为(Thread Local Allocation Buffer )即线程本地分配缓存,线程专用的内存分配区域,为了加速对象的分配而产生的。

每一个线程都会有一个TLAB,该线程独享的工作区域,java使用这种TLAB区域来避免多线程冲突的问题,提高了对象分配的速率。TLAB空间不会太大,当大对象无法在TLAB分配时,则直接分配到堆上。

 

-XX:+UseTLAB 使用TLAB

-XX:+TLABSize 设置TLAB的大小

-XX:TLABRefillWasteFraction 设置维护进入TLAB空间的单个对象的大小。他是一个比例值,默认为64,如果对象大于真个空间的1/64,则在堆中创建对象。

-XX:+PrintTLAB 查看TLAB信息

-XX:ResizeTLAB 自动调整TLABRefillWasteFraction的阈值。

 

分享到:
评论

相关推荐

    JVM之基本的垃圾回收算法汇总

    这篇博客将探讨JVM中的基本垃圾回收算法,帮助我们更好地理解JVM内存管理的原理。 1. 标记-清除(Mark-Sweep)算法 这是最早的垃圾回收算法之一。它分为两个阶段:标记和清除。首先,从根节点开始遍历所有可达对象...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数

    JVM调优总结(三)基本垃圾回收算法.pdf

    JVM垃圾回收算法总结 垃圾回收算法是Java虚拟机(JVM)中的一种机制,用于回收无用的对象以释放内存空间。垃圾回收算法可以从不同的角度划分,下面是常见的垃圾回收算法: 1. 引用计数(Reference Counting) ...

    深入理解JVM垃圾收集算法与垃圾收集器

    深入理解JVM垃圾收集算法与垃圾收集器

    JVM的垃圾回收算法工作原理详解

    "JVM垃圾回收算法工作原理详解" JVM垃圾回收算法工作原理详解主要介绍了JVM的垃圾回收算法如何判断对象是否可以被回收,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 JVM垃圾...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...

    JVM垃圾回收机制

    JVM垃圾回收机制通过两种主要算法来确定对象是否成为垃圾,即“可达性分析算法”和“引用计数法”。 - 可达性分析算法:这种方法通过确定对象的引用链来判断对象是否可达。GC根对象包括虚拟机栈中引用的对象、方法...

    深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化.docx

    3. 优化垃圾回收算法:针对 ARM 服务器的特点,可以优化 JVM 的垃圾回收算法。例如,使用更加高效的垃圾回收算法,如标记-清除算法、复制算法等,来提高垃圾回收的效率。此外,还可以考虑使用增量式垃圾回收算法,...

    jvm+ 垃圾算法+垃圾回收概述

    jvm+ 垃圾算法+垃圾回收概述

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

    2. **垃圾回收算法**: - **标记-清除(Mark-Sweep)**:首先标记出所有活动对象,然后清除未标记的对象。缺点是容易产生内存碎片。 - **复制(Copying)**:将内存分为两块,每次只使用一块,当一块用完后,将...

    详解JVM的垃圾回收算法来做细节.docx

    《详解JVM的垃圾回收算法》 垃圾回收是Java虚拟机(JVM)管理内存的重要机制,它自动识别并清理不再使用的对象,以避免内存泄漏。本文将深入探讨JVM的垃圾回收算法及其细节,包括可达性分析、根节点枚举、安全点、...

    JVM垃圾回收机制与GC性能调优

    Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...

    jvm垃圾回收机制:.md

    全面概述jvm垃圾回收机制的功能、各部分组成及各部分算法实现

    JVM垃圾回收.jpg

    jvm 垃圾回收思维导图,总结了现有的垃圾回收器的有点以及使用场景、垃圾回收算法以及回收的判断依据。

    JVM垃圾回收器和内存分配策略.docx

    JVM 垃圾回收器和内存分配策略 JVM 垃圾回收器是 Java 虚拟机(JVM)中的一种自动内存管理机制,用于回收无用的对象和释放内存空间。垃圾回收器的主要作用是减少内存泄露和提高应用程序的性能。 垃圾回收器的类型...

    JVM的垃圾回收机制详解和调优

    二、垃圾回收算法 1. 标记-清除(Mark-Sweep):标记所有可达对象,然后清除不可达对象。缺点是容易产生碎片。 2. 复制(Copying):将内存分为两块,每次只使用一块,当一块满时,将存活对象复制到另一块,然后...

    JVM垃圾回收原理

    引用计数是一种较为古老且简单的垃圾回收算法。其基本思想是在每个对象中附带一个引用计数器,每当有一个地方引用它时,引用计数器的值就加一;当引用失效时,引用计数器的值减一。垃圾回收时只需要收集引用计数器值...

    垃圾回收系列(3):CLR与JVM垃圾回收器的比较扫描.pdf

    在本篇文章中,我们将对比CLR和JVM的垃圾回收机制,从分代机制、回收模式、回收算法到查找存活对象的技术,深入探究它们之间的异同。 分代式垃圾回收是CLR和JVM的共同策略。该策略基于“弱代假设”,即大多数对象的...

Global site tag (gtag.js) - Google Analytics