「每日五分钟,玩转 JVM」:GC 概览
前言
GC(Garbage Collection)是我们在学习 JVM 的过程中不可避免的一道坎,接下来,我们就来系统的学习一下 GC。

做一件事情之前,我们一定要去知道我们为什么要去做,这里不仅仅指 GC,更适用我们日常的学习和生活,知其然,知其所以然,方能百战不殆。
下面我们先去了解为什么要有 GC,以及 GC 在 JVM 中扮演了一个什么样的角色,起到了什么的作用?
为什么要有 GC
用过 C++ 的同学可能知道,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象。如果我们不去手动的清除这些无用的对象,内存很快就被占满,而在 JVM 中,GC 所起到的作用就是一个清道夫,它可以帮助我们去判定哪些对象是无用对象,怎么进行垃圾收集,以及决定内存分代和内存分配的策略**。
可能有同学会问了,既然我们的 JVM 会给我们做 GC 的工作,我们为什么还要去学习 GC 呢,一切交给 JVM 不好吗?当然,在我们的日常情况下,我们一般不会去关心 GC 的一些细节,但是当我们遇到内存泄露,内存溢出,高并发瓶颈的时候,我们就需要去对 GC 开刀,进行更为细致的监控和调节。
内存泄露:指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存溢出:应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。
那么现在问题来了,我们要进行垃圾回收,首先我们需要知道垃圾在哪
垃圾在哪
前面我们讲了JVM 的运行时内存区域,知道线程可以分为线程独占区和线程共享区,其中线程独占区(程序计数器,虚拟机栈,本地方法栈)的内存生命周期是和线程保持一致,且这几个区域分配的内存大小跟类的大小有关,也就是说,当我们的类结构固定之后,这部分的内存就不会再发生更改,且当方法或线程结束的时候,内存自然就跟随着回收了.
而线程共享区的堆内存和方法区则不一样,堆内存和方法区所用的内存是在编译期间无法确定的,因为一个接口的不同实现,一个方法的不同控制条件分支所执行的代码可能完全相反,我们只有在运行时才知道会创建哪些对象,这部分的内存的分配和回收是动态的,而我们的 GC 关注的就是该部分的内存。
打个比方来说:JVM 如果是一辆车,线程独占区的就像是零件,在出厂时这些零件的寿命基本上都是已知的,线程共享区就像是汽油,汽油的消耗跟我们所采用的路线有关,所以我们关注的部分就是这部分会动态变化的,比如如何开车才能更省油~
知道了垃圾在什么位置会出现,我们下一步就需要去判定在这些区域的有哪些是垃圾~
下节预告
本节内容到这里先告一段落,下一节我们来学习,怎么去判定是否为垃圾~
公众号
「每日五分钟,玩转 JVM」:GC 概览的更多相关文章
- 「每日五分钟,玩转JVM」:线程共享区
前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...
- 「每日五分钟,玩转JVM」:对象从哪来
面向对象 众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做 ...
- 「每日五分钟,玩转JVM」:对象内存布局
概览 一个对象根据不同情况可以被划分成两种情况,当对象是一个非数组对象的时候,对象头,实例数据,对齐填充在内存中三分天下,而数组对象中在对象头中多了一个用于描述数组对象长度的部分 对象头 对象头分为两 ...
- 「每日五分钟,玩转JVM」:线程独占区
前言 如果我们对计算机组成有所了解,那么我们一定会知道在计算机中有一块儿特殊的区域,称之为寄存器,寄存器包括了指令寄存器和程序计数器,这两样位于CPU中,作为程序运行的大脑来控制程序的运行和流转. 而 ...
- 「每日五分钟,玩转JVM」:指针压缩
64位JVM和32位JVM 最初的时候,JVM是32位的,但是随着64位系统的兴起,JVM也迎来了从32位到64位的转换,32位的JVM对比64位的内存容量比较有限,但是我们使用64位虚拟机的同时,也 ...
- 「每日五分钟,玩转JVM」:两种算法
前言 上篇文章,我们了解了GC 的相关概念,这篇文章我们通过两个算法来了解如何去确定堆中的对象实例哪些是我们需要去回收的垃圾对象. 引用计数算法 引用计数法的原理很简单,就是在对象中维护一个计数器,当 ...
- zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》
本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图 zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...
- zookeeper核心-zab协议-《每日五分钟搞定大数据》
上篇文章<paxos与一致性>说到zab是在paxos的基础上做了重要的改造,解决了一系列的问题,这一篇我们就来说下这个zab. zab协议的全称是ZooKeeper Atomic Bro ...
- HDFS-异常大全-《每日五分钟搞定大数据》
点击看<每日五分钟搞定大数据>完整思维导图以及所有文章目录 问题1:Decomminssioning退役datanode(即删除节点) 1.配置exclude: <name>d ...
随机推荐
- Python玩转人工智能最火框架 TensorFlow应用实践 ☝☝☝
Python玩转人工智能最火框架 TensorFlow应用实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 全民人工智能时代,不甘心只做一个旁观者,那就现在 ...
- Linux防火墙常用操作
/tcp —— 配置白名单 sudo systemctl start firewalld — 启动防火墙 sudo firewall-cmd --state - 看状态 sudo firewall-c ...
- 【前端词典】几个有益的 CSS 小知识
今天偷个懒,不长篇大论,分享几个你可能不知道的 CSS 小知识. 样式的顺序 CSS 代码: HTML 代码: 记得之前这是一道比较火的 CSS 考题,当时好像是有不少的人答错(30% 以上) ...
- Oracle基于延时的盲注总结
0x00 前言 oracle注入中可以通过页面响应的状态,这里指的是响应时间,通过这种方式判断SQL是否被执行的方式,便是时间盲注: oracle的时间盲注通常使用DBMS_PIPE.RECEIVE_ ...
- socat的介绍与使用
Socat 是 Linux 下的一个多功能的网络工具,名字来由是 「Socket CAT」.其功能与有瑞士军刀之称的 Netcat 类似,可以看做是 Netcat 的加强版. Socat 的主要特点就 ...
- JSON:JSON对象和JSON数组混排的复杂字符串
在java中的一个好用的JSON工具包:net.sf.json.JSONObject 和 net.sf.json.JSONArray 一 解析JSON对象和JSON数组类型混排的复杂字符串 举个例子: ...
- 机器学习:IB1算法的weka源码详细解析(1NN)
机器学习的1NN最近邻算法,在weka里叫IB1,是因为Instance Base 1 ,也就是只基于一个最近邻的实例的惰性学习算法. 下面总结一下,weka中对IB1源码的学习总结. 首先需要把 ...
- MySQL 插入记录时自动更新时间戳
将字段设置成timestamp类型,同时默认值设置成 CURRENT_TIMESTAMP.
- opencv::图像矩(Image Moments)
矩的概念介绍 1.几何矩 2.中心距 3.中心归一化距 4.图像中心Center(x0, y0) 计算矩 moments( InputArray array, // 输入数据 bool binaryI ...
- pytest4-单文件使用fixture(Fixtures as Function arguments)
Fixtures as Function arguments (fixture作为函数参数传入)Test functions can receive fixture objects by naming ...