前言

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

做一件事情之前,我们一定要去知道我们为什么要去做,这里不仅仅指 GC,更适用我们日常的学习和生活,知其然,知其所以然,方能百战不殆。

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

为什么要有 GC

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

可能有同学会问了,既然我们的 JVM 会给我们做 GC 的工作,我们为什么还要去学习 GC 呢,一切交给 JVM 不好吗?当然,在我们的日常情况下,我们一般不会去关心 GC 的一些细节,但是当我们遇到内存泄露,内存溢出,高并发瓶颈的时候,我们就需要去对 GC 开刀,进行更为细致的监控和调节。

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

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

那么现在问题来了,我们要进行垃圾回收,首先我们需要知道垃圾在哪

垃圾在哪

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

而线程共享区的堆内存和方法区则不一样,堆内存和方法区所用的内存是在编译期间无法确定的,因为一个接口的不同实现,一个方法的不同控制条件分支所执行的代码可能完全相反,我们只有在运行时才知道会创建哪些对象,这部分的内存的分配和回收是动态的,而我们的 GC 关注的就是该部分的内存。

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

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

下节预告

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

公众号

「每日五分钟,玩转 JVM」:GC 概览的更多相关文章

  1. 「每日五分钟,玩转JVM」:线程共享区

    前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...

  2. 「每日五分钟,玩转JVM」:对象从哪来

    面向对象 众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做 ...

  3. 「每日五分钟,玩转JVM」:对象内存布局

    概览 一个对象根据不同情况可以被划分成两种情况,当对象是一个非数组对象的时候,对象头,实例数据,对齐填充在内存中三分天下,而数组对象中在对象头中多了一个用于描述数组对象长度的部分 对象头 对象头分为两 ...

  4. 「每日五分钟,玩转JVM」:线程独占区

    前言 如果我们对计算机组成有所了解,那么我们一定会知道在计算机中有一块儿特殊的区域,称之为寄存器,寄存器包括了指令寄存器和程序计数器,这两样位于CPU中,作为程序运行的大脑来控制程序的运行和流转. 而 ...

  5. 「每日五分钟,玩转JVM」:指针压缩

    64位JVM和32位JVM 最初的时候,JVM是32位的,但是随着64位系统的兴起,JVM也迎来了从32位到64位的转换,32位的JVM对比64位的内存容量比较有限,但是我们使用64位虚拟机的同时,也 ...

  6. 「每日五分钟,玩转JVM」:两种算法

    前言 上篇文章,我们了解了GC 的相关概念,这篇文章我们通过两个算法来了解如何去确定堆中的对象实例哪些是我们需要去回收的垃圾对象. 引用计数算法 引用计数法的原理很简单,就是在对象中维护一个计数器,当 ...

  7. zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图   zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...

  8. zookeeper核心-zab协议-《每日五分钟搞定大数据》

    上篇文章<paxos与一致性>说到zab是在paxos的基础上做了重要的改造,解决了一系列的问题,这一篇我们就来说下这个zab. zab协议的全称是ZooKeeper Atomic Bro ...

  9. HDFS-异常大全-《每日五分钟搞定大数据》

    点击看<每日五分钟搞定大数据>完整思维导图以及所有文章目录 问题1:Decomminssioning退役datanode(即删除节点) 1.配置exclude: <name>d ...

随机推荐

  1. 【TencentOS tiny】 超详细的TencentOS tiny移植到STM32F103全教程

    移植前的准备工作 1. 获取STM32的裸机工程模板 STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程即可.可以从我github上获取https://github.com/jiej ...

  2. VMware15.5版本下安装CentOS_7_64bit

    本文介绍在VMware15.5版本下安装CentOS7. 工具准备: 1.VMware15.5版本 2.CentOS 7 64bit ISO镜像文件 一.创建虚拟机 这部分请参照我的另一个博客“一.新 ...

  3. OpenCV支持Qt用户界面

    在运行opencv程序的时候报下面的错误: ... The library is compiled without QT support in function ... 原因是在使用cmake安装op ...

  4. Ubuntu系统下制作U盘启动盘

    在终端输入 sudo fdisk -l 查看U盘的路径,如/dev/sdb或/dev/sdc. 然后下载ISO文件,如文件路径为/home/raina/xxx.iso 在终端输入 sudo dd if ...

  5. 实验吧之【简单的sql注入 1、2、3】

    实验吧的三道sql注入(感觉实验吧大部分web都是注入) 简单的SQL注入 地址:http://ctf5.shiyanbar.com/423/web/ 这道题也是sql注入,输入1,页面显示正常,输出 ...

  6. 全平台正向tcp端口转发工具rinetd的使用

    Linux下做地址NAT有很多种方法.比如haproxy.nginx的4层代理,linux自带的iptables等都能实现.其实,Linux下有一个叫rinetd的工具,安装简单,配置也不复杂. 下载 ...

  7. CentOS6.5下搭建文件共享服务(Samba)

    Samba服务: 本内容为samba服务学习者提供参考 案例描述: 某公司的管理员需要搭建SAMBA服务器,IP地址及允许的访问网段自定义.SAMBA服务器的安全级别为user级,所在工作组为WORK ...

  8. linux网络通讯相关命令

    ifconfig 1.查看当前使用的网卡 watch cat /proc/net/dev 看下哪张网卡的流量变化大一般就是哪张网卡是在线使用的 2.ifconfig查看所有网卡信息,ifconfig ...

  9. Centos7 安装redis 并新建springboot工程使用Redis 做session

    Redis 安装 就是解压运行,根据自己的爱好,放到文件夹中 tar -zxvf redis-5.0.4.tar.gz yum install gcc cd redis-5.0.4 make MALL ...

  10. django-模板之静态文件加载(十四)

    1.在templates同级目录下建static 2.index.css 3.index.html {% load static %} <!DOCTYPE html> <html l ...