前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >「每日五分钟,玩转 JVM」:GC 概览

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

作者头像
山禾说
发布于 2019-11-12 08:18:59
发布于 2019-11-12 08:18:59
3530
举报
文章被收录于专栏:Vi的技术博客Vi的技术博客

前言

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

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

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

为什么要有 GC

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

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

内存泄露:指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存溢出:应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。

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

垃圾在哪

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

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

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

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

下节预告

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jvm内存结构
jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区和堆区是线程共享的
leobhao
2022/06/28
8860
jvm内存结构
Java JVM 内存泄露 基本概念 解析及排查处理办法
JAVA是垃圾回收语言的一种,开发者无需特意管理内存分配。但是JAVA中还是存在着许多内存泄露的可能性,如果不好好处理内存泄露,会导致APP内存单元无法释放被浪费掉,最终导致内存全部占据堆栈(heap)挤爆进而程序崩溃。
大鹅
2021/06/16
1.2K0
助力金三银四面试JVM 高频面试题篇
方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序计数器是运行时线程私有的内存区域。
没有故事的陈师傅
2023/05/01
2940
助力金三银四面试JVM 高频面试题篇
jvm触发full gc条件(Linux内存管理机制)
GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。缺点就是:1. 有可能不知不觉浪费了很多内存。2. JVM花费过多时间来进行内存回收。3. 内存泄露
全栈程序员站长
2022/07/28
2.7K0
jvm触发full gc条件(Linux内存管理机制)
JVM学习记录-对象已死吗
前言 先来回顾一下,在jvm运行时数据区,分为两部分,一个部分是线程共享区,主要包括堆和方法区,另一部是线程私有区分包括本地方法栈,虚拟机栈和程序计数器。在线程私有部分的三个区域是随着线程生和灭的。栈中的栈帧随着方法的进入和退出而执行着出栈和入栈操作。每一个栈帧所用内存大小在类结构确定下来时就已知了。因此这线程私有区的内存分配和回收都具备确定性,简单概括的说:这部分内存在类加载时分配,在线程结束时回收。(个人理解) 而线程共享区(堆和方法区)则不一样,一个方法中的多个分支需要的内存可能不一样,只有在程序处于
纪莫
2018/04/24
7360
JVM学习记录-对象已死吗
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM(Java Virtual Machine,即java虚拟机),java程序的运行环境(java二进制字节码的运行环境)。
寻求出路的程序媛
2024/08/01
1440
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM-方法区
方法区概述 《Java虚拟机规范》中明确说明:"尽管所有额方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会去进行垃圾收集或者进行压缩",但是对于HotspotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆区分开,所以,方法区看做是一个独立于Java堆的内存空间
是小张啊喂
2023/02/21
3460
Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
今天介绍一下JVM内部的一些区域,以及具体的区域在运行过程中会发生哪些异内存常! 其实也就对应了内存管理的第一篇中 JVM的第三个阶段,程序运行内存溢出。
凯哥Java
2022/12/15
1.7K0
Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
JVM内存模型
JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁
黑洞代码
2021/01/14
5510
JVM内存模型
JVM活学活用——GC算法 垃圾收集器
概述 ----  垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。 对象存活判断 ----  判断对象是否存活一般有两种方式: 引用计数:每个对象有一个引用计数属
Janti
2018/04/10
6490
JVM活学活用——GC算法 垃圾收集器
JVM全网最全面试题
线程私有的,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址。程序计数器主要有两个作用:
爱撒谎的男孩
2023/08/26
2250
JVM全网最全面试题
JVM架构和GC垃圾回收机制(JVM面试不用愁)[通俗易懂]
JVM全称是Java Virtual Machine(Java虚拟机),Java虚拟机是一种程序虚拟机(相对操作系统虚拟机),Java的运行环境实现跨平台。
全栈程序员站长
2022/08/11
4090
JVM架构和GC垃圾回收机制(JVM面试不用愁)[通俗易懂]
JVM之内存结构
定义:记住下一条执行执行的地址,一条指令执行完成后,解释器会到程序计数器找到下一条指令的地址,通过寄存器实现(cpu中最快的) 特点:线程私有,每个程序有自己的程序计数器 唯一不会存在内存溢出的地方 局部变量在栈
一只
2023/08/10
1900
GC及JVM参数
这个GC跟JVM内容太多了,理论性东西多些,少年时还能记个八九成,好久没弄,都忘记了。这次权当整理温习,再看看《深入理解JVM虚拟机》,找些过去写的博客挖点东西过来!
码农戏码
2021/03/23
9960
JVM基础和调优[通俗易懂]
注意:还是会造成线程等待现象–>Stop-The-World(STW),但是减少垃圾回收的停顿时间就会同时减小系统的吞吐量
全栈程序员站长
2022/06/28
4700
JVM基础和调优[通俗易懂]
关于JVM内存溢出的原因分析及解决方案探讨
当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出。
技术zhai
2019/08/18
2.2K0
面试题:请讲讲JVM的内存模型
  本文内容是基于 JDK 1.6 的,不同版本虚拟机之间也许会有些许差异,但不影响我们对JVM 内存模型的整体把握和了解。
用户1263954
2019/07/16
1.3K1
面试题:请讲讲JVM的内存模型
不好意思!耽误你的十分钟,JVM内存布局还给你
在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,Sun Microsystems公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。
JavaSouth南哥
2024/08/20
1521
不好意思!耽误你的十分钟,JVM内存布局还给你
一篇文章彻底搞懂Java虚拟机垃圾回收(GC)机制
方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息
你好戴先生
2020/09/03
1.9K0
Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
例:Object.finallize()、 Windows.dispose()、 System.gc()
马士兵的朋友圈
2020/09/08
1.4K0
Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
推荐阅读
相关推荐
jvm内存结构
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文