下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
 

java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已经介绍了CLR中GC的对象回收方式,是基于代的内存回收策略,其实在java中,JVM的对象回收策略也是基于分代的思想。这样做的目的就是为了提高垃圾

回收的性能,避免对堆中的所有对象进行检查时所带来的程序的响应的延迟,因为jvm执行GC时,会stop the word,即终止其它线程的运行,等回收完毕,才恢复其它线程的操作。基于分代的思想是:jvm在每一次执行垃圾收集器时,只是对一小部分内存

对象引用进行检查,这一小部分对象的生命周期也更短,从而加快了垃圾收集的性能。下面我们将来介绍java中的基于代的内存回收算法的基本策略:

一、jvm堆内存的分代划分

在基于分代的内存回收策略中,堆空间通常都被划分为3个代,年轻代,年老代(或者tenured代),永久代。在年轻代中又被划分了三个小的区域,分别为:Eden(伊甸)区,S0区(survivor 0),S1区(survivor 1),如下图所示:

其中,新的对象总被分配到年经代中,当年轻代空间被填满时,这时需要执行一次垃圾回收,即执行 minor GC,回收不再被引用的对象,并同时提升幸存的对象其年龄,年经代中的幸存对象都有年龄标识字段,一旦其达到一定的阈值,则仍然幸存的对象将被提升到老年代空间中。

老年代的空间用于存放长时间幸存的对象,即生命周期较长的对象,一旦年轻代空间的幸存对象达到一定的年龄阈值后,将被自动提升到年老代,当年老代空间被对象填满时,这时执行一次Major GC。相较于minor GC, Major GC的执行次数要比minor GC要少很多,同时,Major Gc 执行的时间较Minor Gc要长。因为其涉及到更多的对象扫描。这种分代的思想,也是基于在实践中,对于新分配的对象具有更短的生命周期,年老的对象具有更长的生命周期所作出的较佳的选择。

与此同时,Minor Gc 和 Major Gc 在执行垃圾收集时,采取的是stop the world event ,即终止正在运行的线程,等GC执行完毕在恢复所有的线程。

对于永久代的内存,主要是用来存放元数据的相关信息,类及其方法的信息。当一个类不再使用时将会被回收,当执行Full GC时,将会扫描永久代内存,对其进行垃圾回收。

二、基于分代的垃圾回收的处理过程


首先,初始时,新对象被分配到Eden区域,s0,s1为空。当Eden中的空间被填满时,执行一次Minor GC。垃圾收集器会将被引用的对象移动s0区,不再被引用的对象将被删除,与此同时,对于幸存的对象标识其年龄为1. GC后,Eden和S1区为空如下图所示。

下一次执行Minor GC后,与先前的执行步骤相同,唯一的区别时,这次的被引用的对象,即幸存下来的对象将会被移动到S1区,与此同时在s0区幸存的对象的年龄会增加1,变成2,如下图所示。

当再次,执行Minor GC后,与先前的步骤相同,幸存对象会被移到S0区,给幸存对象年龄加1.如下图所示

最后执行Minor GC 时,发现 S1中的幸存的对象年龄达到8(假设阈值 设为8),此时该对象将被提升到老年代内存中,如下图所示。

Z

当老年代堆空间被对象填满时,将会执行一次Major Gc,将会清除老年代不再被引用的对象,与此同时,对该空间执行压缩。如下图所示。

以上这篇浅谈jvm中的垃圾回收策略就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

浅谈jvm中的垃圾回收策略的更多相关文章

  1. JVM内存管理中的垃圾回收策略

    JVM垃圾回收策略 1.静态内存分配和回收 编译时已经确定了内存空间大小,程序被加载后则一次性分配好内存空间.程序结束后,则对应栈帧撤销,分配的静态内存空间则被回收. 2.动态内存分配和回收 程序运行 ...

  2. JVM分代垃圾回收策略的基础概念

    由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为什么要分代,如何分代,以及垃圾回收 ...

  3. JVM中的垃圾回收

    GC 垃圾回收回收什么 Java的内存分配原理与C/C++不同.C/C++每次申请内存时都要malloc进行系统调用.而系统调用发生在内核空间,每次都要中断进行切换,这须要一定的开销. 而Java虚拟 ...

  4. JVM | 分代垃圾回收策略的基本概念以及过程

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  5. 浅谈js中的垃圾两种回收机制

    一.标记清除 标记清除的主要思想是先建立各个对象的关联,然后从根节点出发,使用广度优先搜索依次标记所有对象,那些不能被标记的对象就应该作为垃圾回收. 这种方式的主要缺点就是如果某些对象被清理后,内存是 ...

  6. 浅谈java内存分配和回收策略

    一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配 ...

  7. JVM 中的垃圾回收

    说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...

  8. JVM中的垃圾回收算法GC

    GC是分代收集算法:因为Young区,需要回收垃圾对象的次数操作频繁:Old区次数上较少收集:基本不动Perm区.每个区特点不一样,所以就没有通用的最好算法,只有合适的算法. GC的4大算法 1.引用 ...

  9. 浅谈JVM线程调度机制及主要策略

    在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...

随机推荐

  1. SpringMVC------在运行项目的时候run as 里面没有run on server 解决办法

    1.第一步:选中项目,右键,点击Properties 2.第二步:在查找框里输入Project Facets ,点击蓝色的,如图: 第三步:选中Dynamic Web Module,应用就可以了 转载 ...

  2. Java使用ListIterator逆序ArrayList

    对于列表而言,除了Iterator,还提供了一个功能更加强大的ListIterator.它可以实现逆序遍历列表中的元素.本示例将使用其逆序遍历ArrayList. 思路分析:要逆序遍历某个列表,首先要 ...

  3. UDP通信-UdpClient

    static void Main(string[] args) { Console.WriteLine("发送端"); byte[] buffer = System.Text.En ...

  4. CMake设置输出目录

    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAK ...

  5. UITableView+FDTemplateLayoutCell源码学习笔记

    本文转载至  http://www.cocoachina.com/bbs/read.php?tid=299773 基本原理是通过缓存每个cell的高度,当tableview回调delegate的hei ...

  6. 基础知识《零》---一张图读懂JDK,JRE,JVM的区别与联系

  7. RabbitMQ Queue中Arguments属性参数过期队列,过期消息,超时队列的声明

    开发十年,就只剩下这套Java开发体系了 >>>   创建队列时指定参数 队列属性:x-message-ttl 可以控制被publish到queue中的message 被丢弃前能够存 ...

  8. Android Studio 出现 Gradle's dependency cache may be corrupt 解决方案

    将 .\项目地址\gradle\wrapper\gradle-wrapper.properties 文件中的 gradle版本 与 正常的版本 修改一致即可.

  9. 【.netcore学习】.netcore添加到 supervisor 守护进程自启动报错

    配置 supervisor [program:HelloWebApp] command=dotnet run directory=/home/python/dotnet/myweb/mywebapi ...

  10. Androidの矢量图形之VectorDrawable研究

    5.0以上支持VectorDrawable了,可以创建vector的xml资源文件.vector其实就使用来绘制矢量图形的. 看一个例子: <?xml version="1.0&quo ...