深入理解_JVM内存管理垃圾收集算法04

1、垃圾收集算法(方法论):

定义:JVM通过GC来回收堆和方法区中的内存。

GC的基本原理:首先会找程序中不再被使用的对象;然后回收这些对象所占用的内存。

算法分类:

(1) 按照基本回收策略分:

<1>引用计数(Reference Counting):

比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

<2> 标记-清除(Mark-Sweep):

Before GC:

After GC:

算法:此算法执行分两阶段:

(1)从引用根节点开始标记所有被引用的对象。

(2)遍历整个堆,把未标记对象进行回收。

缺点:需要暂停整个应用,同时会产生内存碎片。

<3> 复制(Copying):

算法:

(1)此算法把内存空间划分为两个相等的区域,每次只使用其中一个区域。垃圾回收时,从根集合扫描出存活的对象,并将找到的存活对象复制到一块新的完全未使用的空间中。

(2)此算法每次只处理正在使用中对象,因此复杂成本比较小,同时复制过去以后还能进行相应的内存处理,不会出现“碎片”问题。

(3)当要回收的空间中存活对象较少时,比较高效。

缺点:需要两倍内存空间。

<4> 标记-整理(Mark-Compact):

算法:此算法结合了“标记-清除”和“复制”两个算法的优点。也分两个阶段:

(1)从根节点开始标记所有被引用对象。

(2)遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的期中一块,按顺序排放。

(3)此算法避免了“标记-清除”的碎片,“复制”算法的空间问题。

缺点:移动对象的成本较高。

(2) 按照分区对待的方式分:

(1)增量收集(Incremental Collecting):

实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。

(2)分代收集(Generational Collecting):

基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

目前常用的算法就是:1,2,3与4的组合。

1、标记-清除(Mark-Sweep):

2、复制(Copying):

3、标记-整理(Mark-Compact):

4、分代收集(Generational Collecting):

时间: 2024-10-24 15:06:39

深入理解_JVM内存管理垃圾收集算法04的相关文章

深入理解_JVM内存管理垃圾收集器05

1.垃圾收集器(内存回收方法的具体实现): 名词解释: 并行(Parallel):多条垃圾线程并行工作,但是此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(并不一定是并行的,可能会交替执行),用户程序继续运行,而垃圾收集程序运行于另一个CPU上. HotSpot虚拟机包含的所有收集器如下图: 说明: (a)JDK1.6_Update14之后引入了Early Access版G1收集器. (b)如果两个收集器之间存在连线,就说明它们可以搭配使用. <Y

深入理解_JVM内存管理调优案例分析与实战10

1.高性能硬件上的程序部署策略 目前常用2种方式: (1)通过64位JDK来使用大内存: 使用第一种方式关键: <1>控制应用程序的Full GC频率.譬如10多个小时甚至一天才出现一次Full GC. 关键:大多数对象的生存时间不应该太长,保证老年代空间的稳定. 在大多数网站形势的应用里,主要对象的生存周期都是请求级或页面级的,会话级和全局级的长生命对象相对较少,控制住Full GC. 需要考虑的问题: <1>内存回收导致的长时间停顿: <2>现阶段,64位JDK的性

深入理解_JVM内存管理对象引用03

1.对象引用: (a)对象状态的判断: <1> 引用计数算法:无法解决对象相互引用的问题. <2> 根搜索算法:主流的判断对象是否存活的算法. (1)基本思路:通过一系列的名为:"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相关联时,证明此对象是不可用的,所以它们将会被判断为是可收回的对象. (2)Java中,GC Roots的对象包括下面几种:

深入理解_JVM内存管理典型配置举例09

以下配置主要针对分代垃圾回收算法而言: 1.堆大小设置: 年轻代的设置很关键JVM中最大堆大小有三方面限制: (1)相关操作系统的数据模型(32-bt还是64-bit)限制: (2)系统的可用虚拟内存限制: (3)系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作系统对内存无限制.在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m. 典型设置: (1)场景一: java -Xmx3550m -Xms3550m -X

深入理解_JVM内存管理内存分配和回收策略06

解决两个问题: 1.对象分配内存: 2.回收分配给对象的内存. 本节详细讲解分配的问题: 名词解释: 新生代GC(Minor GC):指发生在新生代的垃圾回收动作,非常频繁,回收速度很快. 老生代GC(Major GC/Full GC):指发生在老生代的垃圾回收动作,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对),速度一般会比Minor GC慢10倍. 打印日志说明: <1> DefNew:串行GC方式(Serial GC). <2> ParNew:Par

深入理解_JVM内存管理JDK监控工具与故障处理工具07

1.jps: JVM process Status Tool,显示系统所有的HotSpot虚拟机进程以及进程的本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier). 对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的.如果启动了多个虚拟机进程,就需要显示主类的功能才能区分了. jps命令格式: jps [option] [hostid] jps主要选项: -v :输出虚拟机进程启动时JVM

深入理解_JVM内存管理JDK监控工具与故障处理工具08

Jconsole: Visial VM: 1.主要功能: (1)显示虚拟机进程及进程的配置和环境信息(jps,jinfo): (2)监视应用程序的CPU.GC.堆.方法区及线程信息(jstat,jstack): (3)dump及分析堆转储快照(jmap,jhat): (4)方法级的程序运行性能分析,找出被调用最多.运行时间最长的方法: (5)离线程序快照:收集程序的运行时配.线程dump.内存dump等信息建立一个快照,可以将快照发送开发者进行bug处理: (6)其他plus可能性. 2.生成和

C#下内存管理--垃圾收集

章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止没有任何一种编程语言对内存管理处理的非常完美,每种语言都在兼顾性能 效率,语法语义易用性等方面折中中有所侧重.例如较之于C#,JAVA等语言C++号称不需要垃圾收集,因为C++本身产生的垃圾很少,诚然这是C++的 优势,这也就是为什么在内存受限或者效率优先的环境下优先考虑C++,但它的缺点也是明显的

你应该这样理解JVM内存管理

在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这两句话中,捕获到了 两个点 . java的自动内存管理机制,极大的节省了开发人员的精力,避免了易错且复杂的内存管理设计,相对于手动的内存管理这是极大的飞跃.java自动内存管理机制,其不能根据具体的场景提供最优的内存管理,其只提供普适的内存管理机制.想比于C++的手动内存管理,灵活性不够,存在制约系