JVM--14---垃圾回收----概述

Posted 高高for 循环

tags:

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


JVM整体架构

Java 和 C++ 语言的区别

从下图我们可以很明确的知道,Java 和 C++ 语言的区别,就在于垃圾收集技术和内存动态分配上,C 语言没有垃圾收集技术,需要我们手动的收集。

  • 垃圾收集技术
  • 内存动态分配

关于垃圾收集有三个经典问题:

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

1. 什么是垃圾?

垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。

  • 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。
  • 磁盘碎片整理
  • 机械硬盘需要进行磁盘整理,同时还有坏道

2. 为什么需要 GC?

  1. 对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。
  2. 除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM 将整理出的内存分配给新的对象
  3. 随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有 GC 就不能保证应用程序的正常进行。而经常造成 STW 的 GC 又跟不上实际的需求,所以才会不断地尝试对 GC 进行优化。

3. 早期垃圾回收

在早期的 C/C++ 时代,垃圾回收基本上是手工进行的。开发人员可以使用 new 关键字进行内存申请,并使用delete 关键字进行内存释放。比如以下代码:

  • 现在,除了 Java 以外,C#、Python、Ruby等语言都使用了自动垃圾回收的思想,也是未来发展趋势,可以说这种自动化的内存分配和来及回收方式已经成为了线代开发语言必备的标准。

Java 垃圾回收机制

优点:

  1. 自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险
  2. 没有垃圾回收器,Java 也会和 C++ 一样,各种悬垂指针,野指针,泄露问题让你头疼不已。自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发

Oracle 官网关于垃圾回收的介绍 https://docs.oracle.com/javase/

担忧:

  1. 对于 Java 开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于“自动”,那么这将会是一场灾难,最严重的就会弱化 Java 开发人员在程序出现内存溢出时定位问题和解决问题的能力。
  2. 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节

GC 主要关注的区域

GC 主要关注于 方法区 和 堆中 的垃圾收集


垃圾收集器可以对年轻代回收,也可以对老年代回收,甚至是全栈和方法区的回收

Java 堆是垃圾收集器的工作重点

从次数上讲:

  • 频繁收集 Young 区
  • 较少收集 Old 区
  • 基本不收集 Perm 区(元空间)

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

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

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

JVM-11. 垃圾回收概述及算法

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

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

JVM垃圾回收机制概述