JVM(二)——GC

  • 引用类型

    • 强引用:类似Object o=new Object()这种引用。只要强引用还存在,对象不会被回收。
    • 软引用:对于软引用关联的对象,在系统将要发生内存溢出前,会被纳入回收范围,并进行第二次回收。
    • 弱引用:被弱引用关联的对象只能生存到下一次回收之前。无论内存是否足够都会被回收。
    • 虚引用:不会影响对象生存时间,也无法获得对象实例,对其唯一期望是关联的实例在被回收时收到一个系统通知。
  • 对象回收

    • 引用计数法(Reference Counting)

      • 给对象中添加一个引用计数器,被引用时+1,失效时-1。任何时刻引用计数为0则对象不可再使用。 这种算法很难应对循环引用的情况。
    • 根搜索算法(GC Roots Tracing)

      • 当一个对象到GC Roots不可达时,证明此对象是不可用的。根搜索算法中,无法到达的对象并非立即回收,而是被标记一次后进行筛选,筛选的条件是此对象是否有必要执行finaliz()方法。存在该方法(未被调用 过)的对象,将被放置在名为F-Queue的队列,并在稍后有虚拟机建立一个低优先级的Finalizer线程执行(虚拟机不承诺该方法执行结束,不一定 会执行), 稍后GC将对F-Queue进行第二次小规模标记,如果此时发现对象可达,将被移出即将回收集合。
      • 可作为GC根的对象包括

        • 虚拟机栈(中局部变量表)中引用的对象。
        • 方法区中类静态属性引用的对象。
        • 方法区中常量引用的对象。
        • 本地方法中JNI(java本地方法)的引用对象。
  • 方法区回收

    • 废弃常量:与堆中实例回收类似(常量池中类、接口、方法、字段的符号引用也类似)。
    • 无用的类:堆中没有该类实例——加载该类的Classloader已被回收,该类对应的java.lang.Class对象没有引用,无法通过反射访问。
    • 大量使用反射、动态代理、CGLib等bytecode框架的场景,以及动态生成jsp或者osgi这类频繁自定义Classloader的场景都需要该功能
  • 垃圾回收算法

    • 标记-清除算法(Mark-Sweep)

      • 算法:首先标记所有需要回收的对象,在标记完成后,统一回收所有被标记对象。
      • 优点:不存在循环引用问题。
      • 缺点:效率不高,会产生大量不连续内存碎片。
    • 复制算法(Copying)

      • 算法:将可用内存分为两块,每次只使用一块,回收时将此块内存中还生存的对象复制到另一块,把已使用的内存清理掉。
      • 优点:不会出现碎片问题。
      • 缺点:浪费。对象存活率较高时,效率降低。
    • 标记-整理算法(Mark-Compact)

      • 算法:与标记-清除算法类似,只是不直接回清除,而是让所有对象向一端移动,然后清理掉端边界以外的内存。
    • 分代收集算法(Genrerational Collection)

      • 算法:根据对象存活周期划分内存为几块,一般是把堆分为新生代和老年代,根据各个时代不同,采用不同算法。
  • 垃圾收集器

    • 示意图

    • Serial

      • 单线程垃圾收集器,运行时停止其他线程直到GC结束。
      • 新生代:复制算法。
      • 老年代:标记-整理算法。
    • ParNew

      • Serial的多线程版本。
      • 新生代:复制算法。并行。
      • 老年代:标记-整理算法。串行。
    • Parallel Scavenge

      • 新生代收集器,使用复制算法。并行。类似ParNew收集器,此收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例。
    • Serial Old

      • 老年代收集器,使用标记-整理算法。串行。
    • Parallel Old

      • Parallel Scavenge的老年代版本。使用标记-整理算法。并行。
    • Cms

      • 以获取最短回收停顿时间为目标的收集器。标记-清除算法。
      • 步骤:
        • 初始标记:快速标记GC根能连接的对象。
        • 并发标记:根搜索,标记待回收。
        • 重新标记:应对标记期间变动的对象的标记记录。
        • 并发清除:回收。
      • CPU敏感。
      • 无法处理浮动垃圾:一些在本次GC过程中生成的数据,只能留待下一次GC。如果GC过程中预留内存无法满足,会抛出Concurrent Mode Failure后,启动Serial Old进行老年代垃圾收集。
      • 标记-清除算法会产生大量空间碎片,在无法为对象找到足够的连续空间时,会触发Full GC。
    • G1

      • 基于标记-整理算法实现,可以精确控制停顿。
  • 内存分配与回收策略

    • 优先在eden分配。大对象直接进入老年代。长期存活对象将进入老年代。
时间: 2024-12-29 07:02:23

JVM(二)——GC的相关文章

JVM的GC概述

JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率.垃圾收集的目的在于清除不再使用的对象.gc通过确定对象是否被活动对象引用来确定是否收集该对象.两种常用的方法是引用计数和对象引用遍历.引用计数引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm

JVM之GC算法的实现(垃圾回收器)

上一节:<JVM之GC算法> 知道GC算法的理论基础,我们来看看具体的实现.只有落地的理论,才是真理. 一.JVM垃圾回收器的结构 JVM虚拟机规范对垃圾收集器应该如何实现没有规定,因为没有最好的垃圾收集器,只有最适合的场景. 图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用.虚拟机所处的区域则表示它是属于新生代还是老年代收集器. 7种:serial收集器.parnew收集器.parallel scavenge收集器.serial  old 收集器.pa

Linux查看某个服务JVM的GC和堆内存使用情况

一.  使用 jps 命令查看配置了JVM的服务 jps 标红部分是进程号 二.查看某个进程JVM的GC使用情况  jstat -gc 71614 5000 jstat -gc 进程号 刷新时间 S0C:年轻代中第一个survivor(幸存区)的容量 (字节) S1C:年轻代中第二个survivor(幸存区)的容量 (字节) S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC :年轻代中Ed

jvm的GC日志分析 [转]

jvm的GC日志分析 标签: jvm内存javagc 2015-06-22 16:37 1566人阅读 评论(1) 收藏 举报  分类: Java(4)  JVM的GC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:5

HotSpot JVM and GC basics study note

Hotspot JVM and GC basics study note JVM components HotSpot JVM comprises three main components: the class loader, the runtime data areas and the execution engine. Key JVM components There are three key components related to tune performance: the hea

Java JVM- jstat查看jvm的GC情况[转]

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况. jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path. jstat        1. jstat -gc pid             可以显示gc的信息,查看gc的次数,及时间.         

JVM层GC调优(下)

GC日志格式 本文是 JVM层GC调优(上) 的后续,在上一篇文章中,我们介绍了JVM的内存结构.常见的垃圾回收算法以及垃圾收集器和不同收集器中的一些GC调优参数.所以通过上文,我们也对GC相关的内容有了一定的了解. 但是光知道一些调优参数是没用的,我们需要能够从GC的日志中去分析可以调优的地方,这样才能使用这些参数去进行相应的调整,所以本小节将介绍一下不同收集器的GC日志格式. 我们这里以Tomcat为例,首先需要在Tomcat的catalina.sh脚本文件中加入打印GC日志的相关参数,如下

JVM(二):Java中的语法糖

JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法糖 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.

[转]JVM系列二:GC策略&amp;内存申请、对象衰老

原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young genera

JVM系列二:GC策略&amp;内存申请、对象衰老

JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young generation,tenured generation和permanet generation.绝大部分的objec被分配在young gener