小仙女讲JVM(3)—垃圾收集机制 񪬗

原文:
http://blog.gqylpy.com/gqy/445

置顶:来自一名75后老程序员的武林秘籍——必读(博主推荐)



来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/

你好,我是一名极客!一个 75 后的老工程师!

我将花两分钟,表述清楚我让你读这段文字的目的!

如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍!

没错,我就是这个老者!

干研发 20 多年了!我也年轻过,奋斗过!我会画原理图,会画 PCB,会模拟,会数字!玩过 PLC,玩过单片机,会用汇编,会用 C!玩过 ARM,比如
PLC,STM32,和时下正在起飞的 NXP RT1052!搞过 DSP,比如 TMS320F28335!搞过 FPGA,不管 Xilinx 还是 Altera,也不管是 Verilog 还是
VHDL,或者直接画数字电路图!我懂嵌入式系统,比如 uCOS 和 Linux!我懂开源的硬件,比如 Arduino
和树莓派!我也搞软件,学了一堆上位机的语言C#,JAVA,Python,Kotlin,Swift!会写爬虫工具,又自学写APP,不管Android 还是 IOS!

可是这一切有什么用呢?土鸡瓦狗!不值一提!干技术的永远就是最苦逼的那个人!

我相信看到这里的你,应该是个 IT
圈的人!或许是个学生,在学习某个技能!或者是个初入职场的年轻人,在啃某个技术!或者是个工程师,被项目困住,想找个资料快速突破阻碍!反正不管怎么样,你们都不会是泛泛之辈,不可能轻易交出智商税!

所以我把这份资料放进我的收费资源里,以证明接下去我要跟你讲的这本武功秘籍是可以真真实实的帮你赚到钱的!

我不知道叫它什么好,我把它写的像武林秘籍!所以我姑且叫它《武林秘籍》或者叫《赚钱秘籍》!

《武林秘籍》里封装了一个本人近期创造的一个可以一劳永逸的赚钱方法!你可以理解为躺着赚钱,或者挂机赚钱!请你放心,不是让你去违法!

我是一个IT男,从来不忽悠别人,这是我做人的原则。若此举能帮助你付起房子首付与月供,减轻一些目前高房价的压力,何乐而不为呢!

我提取里边几个要点:

  1. 将你手里有的资源按照说明书一步一步完成所有动作就可以躺着赚钱。
  2. 你不可能不劳而获,但是用这个方法确实是可以一劳永逸!
  3. 我用业余时间操作这个项目三个月,现在每天稳定收入300+。
  4. 里边会告诉你哪些是资源,怎么源源不断的获取资源。
  5. 里边会告诉你怎么获取爆炸的流量。
  6. 里边会告诉你很多黑技能(不是干坏事)。
  7. 总之,里边字字如金,有些东西我不告诉你可能这辈子都不会知道!

交了这波智商税,你的能力会爆涨,我说的不是你的专业能力,而是在这个社会生存的基础能力!

以上所有的东西可以规为武功的招式,但如果你想短期就实现目标,我还在说明书的最后留下了一些现成资源的下载链接,包括一些稀缺的资源,保证物有所值。这部分内容可以规为内功,继不继承由你自已决定!

好了,最后跟所有的老者不一样的是:这个老人要问你收取一点点小费,才会把无比珍贵的秘籍交到你手中!

以下是付款链接,付款后你将获取《武林秘籍》的访问密码。随后你将解锁另外一个谋生技能,在工作挣着死工资的同时,该技能也能同时帮你赚另一份钱,终身受用!

http://www.gqylpy.com/get_wlmj_pwd

能在此遇见是我们的缘分,我愿意帮助你,祝你取得成功!

传说中的武林秘籍:http://blog.gqylpy.com/gqy/401/

在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。

在本部分我们要解决如下几个问题:

  1. 哪些内存需要回收?
  2. 什么时候回收?
  3. 如何回收?
哪些内存需要回收?

堆和方法区的内存需要回收,其余的不需要回收。

因为只有堆和方法区是线程共享的,其余的是与线程“同生共死”的,线程结束,内存自然就跟着回收了,所以不用管它们。

什么时候回收?

(1)在堆里面:

当对象“死了”的时候就要对其进行内存回收了。啥叫对象死了?就是没有地方引用它了,它无用了。那怎么判断它是否死了呢?有两种方法。

  • 引用计数算法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就+1,当引用失效时,计数器的值就-1,当计数器的值为0时,代表此对象已不被引用,也就是“可以死了”。

但这有一个弊端,就是循环引用的问题。就像下图,堆里的两个对象即使无用了也没办法对其进行回收,因为它们互相引用着,计数器的值至少为1。

  • 可达性分析

所有生成的对象都是一个称为“GC Roots”的根的子树。从GC Roots开始向下搜索,搜索所经过的路径称为引用链。当一个对象到GC Roots没有任何引用链可以到达时,就称这个对象是不可达的,也就是可以被GC回收了。这个是Java中采用较多的方式。

就像下图中的堆中未被引用的对象,就可以对其进行回收。

看到此,本仙女就要提问了:怎么判断一个对象是否还存在着引用?java中的引用分为4种:

  • 强引用:Object o=new Object(),只要强引用存在,GC永远不会回收掉被引用的对象。
  • 软引用:描述一些还有用但非必需的对象。当系统即将发生内存溢出了,就会对其进行回收。
  • 弱引用:只要进行GC,就会对其进行回收。
  • 虚引用:这是最弱的一种引用关系,无法通过虚引用来取得一个对象实例。它的作用是:能在这个对象被收集器回收时收到一个系统通知。

(2)在方法区里面:

我们知道,方法区里存储的是已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。所以我们在方法区里面进行垃圾回收,回收的是一些废弃的常量和无用的类。

  • 怎么判断一个常量是否被废弃了?

看引用计数就可以,如果没有对象引用该常量,则说明此常量被废弃了,也就可以回收了。

  • 怎么判断一个类是无用的类?

有3种情况:

a、该类所有的实例都已经被回收。

b、加载该类的ClassLoader已经被回收。

c、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

如何回收?

有4种算法作为理论:

? 标记-清除算法

? 复制算法

? 标记-整理算法

? 分代收集算法

有5种收集器作为实现:

这一部分在以前博客中讲过,不再赘述啦:【JVM】初识JVM(下)

后记

内存溢出:系统无法再分配出你需要的空间。比如在堆中无法再给新生的对象分配内存了,在栈里栈满了无法再让新栈帧进栈了。

内存泄漏:内存被对象占用着不还,就叫内存泄露。

原文:
http://blog.gqylpy.com/gqy/445

原文地址:https://www.cnblogs.com/mypath1/p/11407448.html

时间: 2024-10-06 16:32:11

小仙女讲JVM(3)—垃圾收集机制 񪬗的相关文章

jvm内存回收机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop

JVM之垃圾收集

众所周知,Java语言的一个重要特性就是自动内存管理与垃圾回收机制.垃圾收集也被称作GC(Garbage Collection),在讲到GC的时候,我根据<深入理解Java虚拟机>中提到的内容,打算从三个方面讲述: 哪些内存需要回收? 什么时候进行回收? 怎样回收? 首先从理论上讲述这三个问题,然后再以HotSpot为例讲述这三点的具体实现. 一.哪些内存需要回收 1.1.哪些内存区域需要考虑GC 前面对于JVM的内存划分中讲到,JVM将其管理的内存分为程序计数器.虚拟机栈.本地方法栈.堆以及

JVM垃圾回收机制总结(6) :透视Java的GC特性

1. 使用 System.gc() 可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求 Java的垃圾回收. 在命令行中有一个参数-verbosegc可以查看Java使用的堆内存的情况,它的格式:java -verbosegc classfile class TestGC { public static void main(String[] args) { new TestGC(); System.gc(); System.runFinalization(); } } class TestG

第一节 垃圾收集机制简介以及简单配置

垃圾收集机制(GC)是JVM用于释放那些不再使用的对象所占用内存的程序和算法.GC并没有写入在java语言定制的标准中,因此并不是所有的JVM都有GC.GC的主要目的就是清除不再使用的对象. 垃圾回收的两种方法: 1.引用计数 引用计数表示一个对象被引用的所有次数,当引用计数为0时,则表示该对象没有被引用,可以将其删除. 2.对象引用树 目前比较常用的垃圾收集机制是对象引用树,即将对像的引用关系构建成一棵树,从一组根对象开始,对所有对象进行查找,通过递归查找若在该树中找到相应的对象,则将该对象标

浅析JVM垃圾回收机制

首先我们需要知道Java的内存分配与回收全部由JVM垃圾回收机制自动完成.每种JVM实现可能采用不同的方法实现垃圾回收机制.在收购SUN之前,Oracle使用的是JRockit JVM,收购之后使用HotSpot JVM.目前Oracle拥有两种JVM实现并且一段时间后两个JVM实现会合二为一.HotSpot JVM是目前Oracle SE平台标准核心组件的一部分.市面上探讨垃圾回收机制,默认都是基于HotSpot JVM的.Ok,我们切入正题,先来看下JVM的内存区域模型, 这张图非常直观的展

javascript的垃圾收集机制

× 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascript程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理.下面将详细介绍javascript的垃圾收集机制 原理 垃圾收集机制的原理很简单:找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔,或代码执行中预定的收集时间,周期性地执行

JVM垃圾回收机制与算法

JVM内存由几个部分组成:堆.方法区.栈.程序计数器.本地方法栈 JVM垃圾回收仅针对公共内存区域,即:堆和方法区进行,因为只有这两个区域在运行时才能知道需要创建些对象,其内存分配和回收都是动态的. 一.垃圾回收策略 1.1分代管理 将堆和方法区按照对象不同年龄进行分代: (Young Generation and Old Generation)堆中会频繁创建对象,基于一种分代的思想,按照对象存活时间将堆划分为新生代和旧生代两部分,并不是一次垃圾回收新生代存活的对象就放入旧生代, 而是要经过几次

JVM 垃圾回收机制(1)

文章出处:http://www.cnblogs.com/lzrabbit/p/3826738.html JVM内存回收机制简述(转载) 目前java的jdk默认虚拟机为HotSpot,因此本文涉及虚拟机相关内容都指HotSpot虚拟机 本文主要关注GC的回收:判断哪些对象可回收,如何回收,回收机制 判断哪些对象可回收 GC是通过对象是否存活来决定是否进行回收,判断对象是否存活主要有两种算法:引用计数算法.可达性分析算法 引用计数算法引用计数的算法原理是给对象添加一个引用计数器,每被引用一次计数器

JAVA垃圾收集机制剖析

1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用. 垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配.垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,