JVM垃圾回收篇(基本概述)

Posted ProChick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM垃圾回收篇(基本概述)相关的知识,希望对你有一定的参考价值。

1.什么是垃圾?

  • 垃圾是指在运行程序的过程中出现了没有任何指针指向的对象,这个对象就是需要被回收的垃圾
  • 如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,那么这些被保留的空间就无法被其他对象使用,甚至可能导致内存溢出
  • 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生
  • 垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集都提出了新的挑战

2.什么是垃圾回收?

  • 在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放
  • 手工的方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存区间由于程序员编码的问题忘记被回收,那么就会产生内存泄漏,垃圾对象就永远无法被清除,那么随着系统运行时间的不断增长,垃圾对象所耗内存可能持续上升,直到出现内存溢出并造成应用程序崩溃
  • 现在,除了Java语言以外,C#、Python、 Ruby等语言都采用了自动垃圾回收的思想,这也是未来发展趋势。可以说,这种自动化的内存分配和垃圾回收的方式己经成为现代开发语言必备的标准

3.常见的垃圾回收问题?

  • 哪些内存需要回收?
  • 什么时候回收?
  • 如何回收?

4.为什么需要垃圾回收?

  • 对于高级语言来说,如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样
  • 除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片,进行碎片整理后,将所占用的堆内存移到堆的一端,以便腾出来更大且连续的空间供JVM将内存分配给新的对象
  • 随着应用程序所应付的业务越来越庞大、越来越复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而目前的GC技术又很难跟上实际的需求,所以也在不断地尝试对GC进行优化

5.什么是垃圾回收机制?

  • 没有垃圾回收机制,Java也会和C++一样,各种悬垂指针、野指针、内存泄露等问题让人头疼不已
  • 有了垃圾回收机制,它就可以自动进行内存管理,无需开发人员手动参与内存的分配与回收,将程序员从繁重的内存管理中释放出来,这样就降低了内存泄漏和内存溢出的风险,从而使得程序员可以更专心地专注于业务开发
  • 对于Java开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于“自动”,那么这将会是一场灾难,最严重的就会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力
  • 所以,了解JVM的自动内存分配和内存回收原理就显得非常重要,只有在真正了解JVM是如何管理内存的,我们才能够在遇见各种内存问题时, 快速地根据错误异常日志定位问题和解决问题
  • 此外,当垃圾回收成为系统想要达到更高并发量或者获取更高系统性能的瓶颈时,我们还需对这些“自动化”的技术实施必要的监控和调节
  • 垃圾回收器可以对年轻代回收,也可以对老年代回收,甚至是全部堆区和方法区的回收。从大量的回收经验来讲,需要频繁收集年轻代、较少收集老年代、基本不动永久代

以上是关于JVM垃圾回收篇(基本概述)的主要内容,如果未能解决你的问题,请参考以下文章

JVM垃圾回收篇(基本概述)

JVM垃圾回收篇(经典垃圾回收器讲解)

JVM垃圾回收篇(经典垃圾回收器讲解)

<JVM上篇:内存与垃圾回收篇;11-垃圾回收概述及算法

JVM垃圾回收篇(重要概念解析)

JVM垃圾回收篇(重要概念解析)