「每日五分钟,玩转 JVM」:GC 概览

前言

GC(Garbage Collection)是咱们在学习 JVM 的过程当中不可避免的一道坎,接下来,咱们就来系统的学习一下 GC。并发

image-20191107213453385

作一件事情以前,咱们必定要去知道咱们为何要去作,这里不只仅指 GC,更适用咱们平常的学习和生活,知其然,知其因此然,方能百战不殆。高并发

下面咱们先去了解为何要有 GC,以及 GC 在 JVM 中扮演了一个什么样的角色,起到了什么的做用?学习

为何要有 GC

用过 C++ 的同窗可能知道,对象所占的内存在程序结束运行以前一直被占用,在明确释放以前不能分配给其它对象。若是咱们不去手动的清除这些无用的对象,内存很快就被占满,而在 JVM 中,GC 所起到的做用就是一个清道夫,它能够帮助咱们去断定哪些对象是无用对象怎么进行垃圾收集,以及决定内存分代和内存分配的策略**。spa

可能有同窗会问了,既然咱们的 JVM 会给咱们作 GC 的工做,咱们为何还要去学习 GC 呢,一切交给 JVM 很差吗?固然,在咱们的平常状况下,咱们通常不会去关心 GC 的一些细节,可是当咱们遇到内存泄露,内存溢出,高并发瓶颈的时候,咱们就须要去对 GC 开刀,进行更为细致的监控和调节。线程

内存泄露:指程序中己动态分配的堆内存因为某种缘由程序未释放或没法释放,形成系统内存的浪费,致使程序运行速度减慢甚至系统崩溃等严重后果。

内存溢出:应用系统中存在没法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。对象

那么如今问题来了,咱们要进行垃圾回收,首先咱们须要知道垃圾在哪blog

垃圾在哪

前面咱们讲了JVM 的运行时内存区域,知道线程能够分为线程独占区和线程共享区,其中线程独占区(程序计数器,虚拟机栈,本地方法栈)的内存生命周期是和线程保持一致,且这几个区域分配的内存大小跟类的大小有关,也就是说,当咱们的类结构固定以后,这部分的内存就不会再发生更改,且当方法或线程结束的时候,内存天然就跟随着回收了.接口

而线程共享区的堆内存和方法区则不同,堆内存和方法区所用的内存是在编译期间没法肯定的,由于一个接口的不一样实现,一个方法的不一样控制条件分支所执行的代码可能彻底相反,咱们只有在运行时才知道会建立哪些对象,这部分的内存的分配和回收是动态的,而咱们的 GC 关注的就是该部分的内存。生命周期

打个比方来讲:JVM 若是是一辆车,线程独占区的就像是零件,在出厂时这些零件的寿命基本上都是已知的,线程共享区就像是汽油,汽油的消耗跟咱们所采用的路线有关,因此咱们关注的部分就是这部分会动态变化的,好比如何开车才能更省油~内存

知道了垃圾在什么位置会出现,咱们下一步就须要去断定在这些区域的有哪些是垃圾~

下节预告

本节内容到这里先告一段落,下一节咱们来学习,怎么去断定是否为垃圾~

公众号

相关文章
相关标签/搜索