Java虚拟机

1. JVM运行时数据区域

  • 参考书籍:《深入理解Java虚拟机:JVM高级特性与最佳实践,第二版》
  • 资料参考:http://blog.csdn.net/nms312/article/details/37361121

    2. 垃圾收集及内存分配

  • GC需要考虑的三个问题:
    1. 哪些内存需要回收?
    2. 什么时候回收?
    3. 怎么回收?
  • JVM中主要讨论堆和方法区里的内存回收。 为了解决上面三个问题:
    1. 哪些内存需要回收?即如何确定需要回收的对象

      1. 引用计数算法
      • 主流的java虚拟机里都没有采用这种方法,因为它很难解决对象直接循环引用的问题。
      1. 可达性分析算法
      • 当一个对象到GC Roots没有任何引用链时,则证明对象是不可用的。
      • 在JDK1.2之后,java将引用分为强引用(Strong Reference),软引用(Soft Reference),弱引用(weak Reference),虚引用(Phantom Reference)。
      • 在JVM中可达性分析算法要判断一个对象需要回收,至少要经过两次标记过程:
      • 如果对象在进行可达性分析后发现没有与GC Roots的引用链,那它将会被第一次标记并进行一次筛选,筛选条件是是否有必要执行finalize()方法。当对象没有覆盖该方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
      • 如果判断有必要执行,加入F-Queue队列中。finalize()方法是对象逃脱被GC的最后一次机会,稍后GC将对队列中的对象进行第二次标记,如果还是无法与GC roots建立关联,将被真正回收。
    2. 怎么回收?即垃圾收集算法
    • 标记-清除算法

      • 最基础的收集算法,它主要有两个不足:一个是效率问题,另一个是空间问题,产生碎片太多。
    • 复制算法
      • 它将可用内存按容量划分为大小相等的两块, 每次只使用其中的一块
      • 现在商业虚拟机都采用这种收集算法来回收新生代。
      • HotSpot虚拟机默认Eden和Survivor的大小比例是8:1
    • 标记-整理算法
      • 复制收集算法在对象存活率较高时就要进行较多的复制操作, 效率将会变低。所以在老年代里一般不直接使用这种算法。
      • 标记过程仍然与“标记-清除”算法一样, 但后续步骤不是直接对可回收对象进行清理, 而是让所有存活的对象都向一端移动, 然后直接清理掉端边界以外的内存。
    • 分代收集算法
      • 当前商业虚拟机的垃圾收集都采用“分代收集”( Generational Collection) 算法。根据对象存活周期的不同将内存划分为几块。 一般是把Java堆分为新生代和老年代, 这样就可以根据各个年代的特点采用最适当的收集算法。

3. JDK的HotSpot虚拟机的垃圾收集器

  • 这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机
  • 展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线, 就说明它们可以搭配使用。 虚拟机所处的区域, 则表示它是属于新生代收集器还是老年代收集器。
  • Serial收集器
    • Serial收集器是最基本,发展历史最悠久的收集器,曾经(再JDK1.3之前)是虚拟机新生代收集的唯一选择。
    • 它是一个单线程收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直到收集结束。
    • 它是虚拟机运行在client模式下的默认新生代收集器。
    • 优于其他收集器的地方: 简单而高效( 与其他收集器的单线程比) , 对于限定单个CPU的环境来说, Serial收集器由于没有线程交互的开销, 专心做垃圾收集自然可以获得最高的单线程收集效率。
  • ParNew收集器
    • ParNew收集器其实就是Serial收集器的多线程版本。
    • ParNew收集器除了多线程收集之外, 其他与Serial收集器相比并没有太多创新之处, 但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器, 其中有一个与性能无关但很重要的原因是, 除了Serial收集器外, 目前只有它能与CMS收集器配合工作。
    • 并发和并行:这两个名词都是并发编程中的概念
    • 并行( Parallel) : 指多条垃圾收集线程并行工作, 但此时用户线程仍然处于等待状态。
    • 并发( Concurrent) : 指用户线程与垃圾收集线程同时执行( 但不一定是并行的, 可能会交替执行) , 用户程序在继续运行, 而垃圾收集程序运行于另一个CPU上。
  • Parallel Scavenge收集器
    • Parallel Scavenge收集器是一个新生代收集器, 它也是使用复制算法的收集器, 又是并行的多线程收集器。
    • Parallel Scavenge收集器的目标是达到一个可控制的吞吐量( Throughput)。
    • 吞吐量=运行用户代码时间/( 运行用户代码时间+垃圾收集时间)
    • 由于与吞吐量关系密切, Parallel Scavenge收集器也经常称为“吞吐量优先”收集器。
    • 自适应调节策略也是ParallelScavenge收集器与ParNew收集器的一个重要区
      别。
  • Serial Old收集器
    • Serial Old是Serial收集器的老年代版本, 它同样是一个单线程收集器, 使用“标记-整理”算法。
    • 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。
    • 在Server模式下, 那么它主要还有两大用途:
      • 一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用
      • 另一种用途就是作为CMS收集器的后备预案
  • Parallel Old收集器
    • Parallel Old是Parallel Scavenge收集器的老年代版本, 使用多线程和“标记-整理”算法。
    • 这个收集器是在JDK 1.6中才开始提供的, 在此之前, 新生代的Parallel Scavenge收集器一直处于比较尴尬的状态。 原因是, 如果新生代选择了ParallelScavenge收集器, 老年代除了Serial Old( PS MarkSweep) 收集器外别无选择
    • 直到Parallel Old收集器出现后, “吞吐量优先”收集器终于有了比较名副其实的应用组合,在注重吞吐量以及CPU资源敏感的场合, 都可以优先考虑Parallel Scavenge加Parallel Old收集器。
  • CMS收集器
    • 在JDK 1.5时期,HotSpot推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器——CMS收集器( Concurrent Mark Sweep)
    • 这款收集器是HotSpot虚拟机中第一款真正意义上的并发( Concurrent) 收集器, 它第一次实现了让垃圾收集线程与用户线程( 基本上) 同时工作
    • CMS( Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记—清除”算法实现,整个过程分为4个步骤:
      • 初始标记( CMS initial mark)
      • 并发标记( CMS concurrent mark)
      • 重新标记( CMS remark)
      • 并发清除( CMS concurrent sweep)
    • 优点:并发收集、 低停顿
    • 缺点:
      • CMS收集器对CPU资源非常敏感。
      • CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
      • CMS是一款基于“标记—清除”算法实现的收集器。意味着收集结束时会有大量空间碎片产生。
  • G1收集器
    • G1( Garbage-First) 收集器是当今收集器技术发展的最前沿成果之一,被视为JDK 1.7中HotSpot虚拟机的一个重要进化特征。
    • 特点:并行与并发,分代收集,空间整合,可预测的停顿。
    • 与CMS的“标记—清理”算法不同, G1从整体来看是基于“标记—整理”算法实现的收集器, 从局部( 两个Region之间) 上来看是基于“复制”算法实现的, 但无论如何, 这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。

Java虚拟机--垃圾收集的更多相关文章

  1. 深入理解java虚拟机【Java虚拟机垃圾收集器】

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  2. (转)《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  3. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

  4. 深入理解Java虚拟机 - 垃圾收集算法与垃圾收集器

    1. 垃圾收集算法       JVM的垃圾收集算法在不同的JVM实现中有所不同,且在平时工作中一般不会深入到收集算法,因此只对算法做较为简单的介绍.       1.1 标记-清除算法        ...

  5. 深入理解Java虚拟机 - 垃圾收集概述

    首先需要澄清的是,垃圾收集(GC)的历史远比Java要久远,当我们意识到手动管理内存所带来的麻烦时,懒惰的天性推动先驱们寻找更为简单.易用.关键是傻瓜式的内存管理技术.GC技术起源于1960年诞生于M ...

  6. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

  7. Java虚拟机-垃圾收集器

    垃圾收集器(Garbage Collection, GC)的诞生引导出了三个问题: 哪些内存需要回收? 什么时候回收? 如何回收? 对于线程独占的三个区域(程序计数器.虚拟机栈.本地方法栈)不用过多的 ...

  8. Java虚拟机—垃圾收集器(整理版)

    1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很 ...

  9. Java虚拟机垃圾收集器

    一.判断对象存活的算法 1.引用计数(Reference Counting)算法 给对象添加一个引用计数器,每当有一个地方引用时,计数器加1.当引用失效时,计数器减1.当计数器的值为0的时候说该对象不 ...

随机推荐

  1. WLAN高密无线网络部署的信道问题

    WIFI信号的信道有两部分,其中2.4G频段有13个左右交叠的信道(14信道只在日本使用),其中只能找出3个相互不重合的信道(具体请参考文末的链接),最常用的就是1.6.11这三个,当然也可以使用其他 ...

  2. CSS实现文字和图片的水平垂直居中

    关于文字和图片的水平垂直居中,在前端界绝对算是一个老生常谈的问题了,尤其是垂直居中,什么千奇百怪的解法都能想的出来.下面我就总结一些比较常用的方法: 一.文本的水平垂直居中: 1.水平居中: 是不是很 ...

  3. 文件描述符与FILE

    1. 文件描述符(重点) 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创 ...

  4. SQL之trigger(触发器)

    先来看一小段程序 有如下三张表: 帐户(编号,姓名,余额,建立日期,储蓄所编号) 储蓄所(编号,名称,地址,人数,所属城市) 借贷(帐户,借贷类型,金额,日期) create trigger tri_ ...

  5. B. Karen and Coffee

    B. Karen and Coffee time limit per test 2.5 seconds memory limit per test 512 megabytes input standa ...

  6. 用netsh wlan命令行解决“Win10下WLAN不自动登陆”问题

    系统崩溃了,找了一个版本Windows 10重装后,发现进入系统后不会自动连接自己家的Wifi,每次都要手动点"登录",烦不胜烦. 于是百度.Google一起上,找解决方案,然后所 ...

  7. 有关LinkedList常用方法的源码解析

    上文里解析了有关ArrayList中的几个常用方法的源码——<有关ArrayList常用方法的源码解析>,本文将对LinkedList的常用方法做简要解析. LinkedList是基于链表 ...

  8. laravel中token的使用方式

    在form表单里提交表单时,可 <form action="" method="post"> <?php  echo csrf_field() ...

  9. IOS 固定定位底部input输入框,获取焦点时弹出的输入法键盘挡住input

    移动页面经常会做到这样一个效果,看下面的图片,重点就是那个固定定位的底部,里面有个input输入框,在输入字符的时候,安卓手机看着是完全没有问题! 1.页面没有点击底部input的初始状态 2.安卓手 ...

  10. 【知识整理】这可能是最好的RxJava 2.x 教程(完结版)

    为什么要学 RxJava? 提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨.近两年来国内的技术圈子中越来越多的开始提及 RxJava ,越来越多的应用和面试中都会有 RxJava ,而就目前的 ...