三.GC相关之三分钟认识GC算法

GC算法慢慢演化,进化到了现在的分代GC。其进化过程 标记-清除算法 –> 标记-复制算法 –> 标记-整理算法 –> 分代算法。

在介绍算法之前,我们知道Java是动态加载。其特点:

1.具有层级关系,由Bootstrap class loader –> Extension class loader -> System class loader (App Class Loader)-> User Defined Class Loader。

2.委派加载方式,加载一个类时,先看父类是否已经加载,只有父类无法加载,子类才会尝试加载,这确保了应用程序加载的是同一个类(同一份代码)。

3.使类具有使用限制,父类无法访问子类加载的类,而子类可以使用父类加载的类。

4.虽然加载类不能卸载其加载的类,但可以删除当前加载类。

如图:

通过Java的动态加载机制我们可以知道,java的一个live对象,可以从根(最顶端的加载类)处追查到。了解了这个我们再来具体的GC算法。

标记-清除算法:

通过将可以追溯到的对象打标记,然后将没有标记的对象删除。这种算法的缺点是会造成内存碎片。

标记-复制算法:

将内存一分为二,将未标记的对象删除,然后将标记的对象复制到另一块。这种算法虽然避免了内存碎片问题,但却带来了内存浪费的问题(有一半内存时空的)。

标记-整理算法:

这种算法将未标记的对象删除,然后将标记的对象进行内存整理。这种算法虽避免了前两种算法的缺陷,但却带来了效率低下的问题。

分代算法:

这种算法可根据应用程序的需要进行算法选择及参数调整,下节我们再具体聊下GC的参数调整。

时间: 2024-10-22 23:12:03

三.GC相关之三分钟认识GC算法的相关文章

GC浅析之三-性能调优经验总结

性能调优经验总结 问题的出现: 在日常环境下,以某server 为例,该机器的每秒的访问量均值在368左右,最大访问量在913.对外提供服务的表现为每两三个小时就有秒级别的时间客户端请求超时,在访问量增大的情况下用户请求超时频率明显增多. 现象的直接分析: 通过监控GC发现该现象,GC中比较频繁的出现promotion failed和concurrent mode failure.由于promotion failed产生的直接原因为在发送YGC时,old区因为碎片.可用空间不够,造成无法晋升对象

Jmeter性能测试-GC相关

1.GC相关 HotSpot虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old generation).新生代(Young generation): 绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可到达,所以很多对象被创建在新生代,然后消失.对象从这个区域消失的过程我们称之为"minor GC". 老年代(Old generation): 对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里.其所占用的空间要比新生代

java栈内存堆内存和GC相关

java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存.而堆内存中的对象对所有线程可见.堆内存中的对象可以被所有线程访问.而堆内存用来存储Java中的对象.无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中. 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放.而数组

Java GC 专家系列3:GC调优实践

本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在第二篇Java垃圾回收的监控中介绍了在真实场景中JVM是如何运行GC,如何监控GC数据以及有哪些工具可用来方便进行GC监控. 在本篇中,我将基于真实的案例来介绍一些GC调优的最佳选项.写本篇文章时,我假设你已经理解了前两篇的内容.为了深入理解本部分内容,你最好先浏览一下前两篇的内

Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问.假如,通过global cache发现这些块已经在另一个实例的Cache里面,那么这些块就会通过Cache Fusion,在节点之间直接传递,

6. GC 调优(工具篇) - GC參考手冊

进行GC性能调优时, 须要明白了解, 当前的GC行为对系统和用户有多大的影响. 有多种监控GC的工具和方法, 本章将逐一介绍经常使用的工具. 您应该已经阅读了前面的章节: 垃圾收集简单介绍 - GC參考手冊 Java中的垃圾收集 - GC參考手冊 GC 算法(基础篇) - GC參考手冊 GC 算法(实现篇) - GC參考手冊 GC 调优(基础篇) - GC參考手冊 JVM 在程序执行的过程中, 提供了GC行为的原生数据. 那么, 我们就能够利用这些原生数据来生成各种报告.原生数据(raw dat

Unity优化之GC——合理优化Unity的GC

最近有点繁忙,白天干活晚上抽空写点翻译,还要运动,所以翻译工作进行的有点缓慢 =.= 本文续接前面的unity的渲染优化,进一步翻译Unity中的GC优化,英文链接在下:英文地址 介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据不在需要的时候,存储当前数据的内存就可以被回收再次使用.内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程. Unity中将垃圾回收当作内存管理的一部分,如果游戏中垃圾回收十分复杂,则游戏的性能会受到极大影响,此时垃圾

Unity优化之GC——合理优化Unity的GC (难度3 推荐5)

原文链接:http://www.cnblogs.com/zblade/p/6445578.html 最近有点繁忙,白天干活晚上抽空写点翻译,还要运动,所以翻译工作进行的有点缓慢 =.= 本文续接前面的unity的渲染优化,进一步翻译Unity中的GC优化,英文链接在下:英文地址 介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据不在需要的时候,存储当前数据的内存就可以被回收再次使用.内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程. Unit

GC 调优(实战篇) - GC参考手册

本章介绍导致GC性能问题的典型情况.相关示例都来源于生产环境, 为演示需要做了一定长度的精简. 说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间内分配的量; 同理, Promotion Rate 翻译为 提升速率; 您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册 Java中的垃圾收集 - GC参考手册 GC 算法(基础篇) - GC参考手册 GC 算法(实现篇) - GC参考手册 GC 调优(基础篇) - GC参考手册 GC