原创 Java垃圾回收器相关问题解答

发布时间:2019-08-20 15:55:44 浏览 1996 来源:博学谷资讯 作者:照照

    相信很许多人在学习Java的时候,都没有搞清楚过Java垃圾回收器。因此本文主要讲述了Java垃圾回收器的定义、性能评估工具、回收算法等等内容,为大家全面解答垃圾回收器的相关问题。

     

    Java垃圾回收器

     

    1、Java垃圾回收器的定义

     

    Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存快)。某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用。垃圾回收操作需要消耗CPU、线程、时间等资源,所以容易理解的是垃圾回收操作不是实时的发生(对象死亡马上释放),当内存消耗完或者是达到某一个指标(Threshold,使用内存占总内存的比列,比如0.75)时,触发垃圾回收操作。有一个对象死亡的例外,java.lang.Thread类型的对象即使没有引用,只要线程还在运行,就不会被回收。

     

    2、Java垃圾回收器的性能评估工具

     

    –XX:+PrintGCDetails和–XX:+PrintGCTimeStamps

     

    垃圾回收的开始时间,持续时间,每一代的空余内存等信息。

     

    jmap [options] pid

     

    jamp 2043 查看2043进程里面已经加载的共享对象。通常DLL文件。

     

    jmap -heap 2043 查看内存堆的配置信息以及使用情况。

     

    jmap -permstat 2043 查看永久代的加载情况。

     

    jmap -histo 2043 查看类的加载和内存占用情况。

     

    jstat [options] pid

     

    jstat -class 2043 class加载、卸载、内存占用情况。

     

    jstat -gc 2043 GC执行情况。

     

    3、垃圾回收算法

     

    (1)标记清除算法

     

    标记清除算法分成两步,第一步,标记要回收的垃圾对象,第二步就是清除被标记的垃圾对象. 标记清除算法会产生大量的内存碎片,而且效率低.所以,为了解决这个问题,出现了复制清除算法.

     

    (2)复制清除算法(专门用于处理年轻代垃圾的)

     

    所谓复制清除算法,就是在要进行垃圾回收的时候,先将活着的对象整齐的复制到一块空闲区域,然后再将原来的区域的垃圾全部清除. 复制清除算法的优点:效率高于标记清除算法,活着的对象是整齐排列的,没有内存碎片. 但是这个方法的缺点也很明显,那就是浪费空间.

     

    (3)标记清理算法(年老代)

     

    将活着的对象一个接一个的按顺序排好,然后再清除变成垃圾的对象.这种方法不会造成碎片,也不会造成内存的浪费.但是效率不高.所以,这种方法不适合在年轻代使用,而是在对象生命力很顽强的年老代使用

     

    (4)分类算法

     

    所谓分类算法,就是根据内存的不同,采用不同的垃圾回收方式(上面的1,2,3)进行垃圾回收.

     

    4、典型的垃圾收集器
      

    (1)Serial/Serial Old
      

    Serial/Serial Old收集器是最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。Serial收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。

     

    (2)ParNew
      

    ParNew收集器是Serial收集器的多线程版本,使用多个线程进行垃圾收集。

     

    (3)Parallel Scavenge
      

    Parallel Scavenge收集器是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。

     

    (4)Parallel Old
      

    Parallel Old是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。

     

    (5)CMS
      

    CMS(Current Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法。

     

    (6)G1
      

    G1收集器是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。

     

    以上就是关于Java垃圾回收器的所有相关问题解答,大家都明白了吗?

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: Java常量知识点小结 下一篇: 零基础学Java开发有多难?Java入门方法

相关推荐 更多

热门文章

  • 程序员为什么不爱炫富?
  • Python 新版本中的 6 个新特性,你去体验了么?
  • 搞Java开发,你知道哪些城市最赚钱吗?
  • 互联网行业都有哪些岗位?看看自己适合哪个吧!
  • 10月数据库排行榜出炉,火速围观!
  • GitLab上市,GitHub的最大对手来了!
  • 中办、国办发文!推动现代职业教育高质量发展!
  • 如何实现代码审查反馈?
  • 初学者,你有没有想过放弃这一行
  • 入门IT行业,首门语言该选什么?
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码