Java虚拟机之垃圾收集

Java虚拟机:垃圾收集原理和垃圾收集器 概述垃圾收集需要完成的3件事情:哪些内存需要回收?什么时候回收?如何回收?目前内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈... 阅读详情

垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。

目录

判断一个对象是否可被回收

1.引用计数算法

2.可达性算法

3.方法区的回收

4.finalize()

引用类型

1.强引用

2.软引用

3.弱引用

4.虚引用

垃圾收集算法

1.标记-清除

2.标记-整理

3.复制

4.分代收集

垃圾收集器

1.Serial收集器

2.ParNew收集器

3.ParallelScavenge收集器

4.Serial Old收集器

5.Parallel Old收集器

6.CMS收集器

7.G1收集器


判断一个对象是否可被回收

1.引用计数算法

引用计数为 0 的对象可被回收(当对象增加一个引用时计数器加 1,引用失效时计数器减 1)。

在两个对象出现循环引用的情况下,不使用引用计数算法(因为计数器永远不为0)

2.可达性算法

以 GC Roots 为起始点进行搜索,可达的对象都是存活的,不可达的对象可被回收。

GC Roots 一般包含以下内容:

  • 虚拟机栈中局部变量表中引用的对象
  • 本地方法栈中 JNI 中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中的常量引用的对象

3.方法区的回收

因为方法区主要存放永久代对象,而永久代对象的回收率比新生代低很多,所以在方法区上进行回收性价比不高。

主要是对常量池的回收和对类的卸载。

为了避免内存溢出,在大量使用反射和动态代理的场景都需要虚拟机具备类卸载功能。

类的卸载条件很多,需要满足以下三个条件,并且满足了条件也不一定会被卸载:

  • 该类所有的实例都已经被回收,此时堆中不存在该类的任何实例。
  • 加载该类的 ClassLoader 已经被回收。
  • 该类对应的 Class 对象没有在任何地方被引用,也就无法在任何地方通过反射访问该类方法。

4.finalize()

用于关闭外部资源,该方法运行代价很高,不确定性大,无法保证各个对象的调用顺序,因此最好不要使用。

当一个对象可被回收时,如果需要执行该对象的 finalize() 方法,那么就有可能在该方法中让对象重新被引用,从而实现自救。自救只能进行一次,如果回收的对象之前调用了 finalize() 方法自救,后面回收时不会再调用该方法。

引用类型

1.强引用

被强引用关联的对象不会被回收。

使用 new 一个新对象的方式来创建强引用。

2.软引用

被软引用关联的对象只有在内存不够的情况下才会被回收。

使用 SoftReference 类来创建软引用。

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;  // 使对象只被软引用关联

3.弱引用

被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。

使用 WeakReference 类来创建弱引用

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;

4.虚引用

又称为幽灵引用或者幻影引用,一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象。

为一个对象设置虚引用的唯一目的是能在这个对象被回收时收到一个系统通知。

使用 PhantomReference 来创建虚引用。

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj, null);
obj = null;

垃圾收集算法

1.标记-清除

在标记阶段,程序会检查每个对象是否为活动对象,如果是活动对象,则程序会在对象头部打上标记。

在清除阶段,会进行对象回收并取消标志位,另外,还会判断回收后的分块与前一个空闲分块是否连续,若连续,会合并这两个分块

在分配时,程序会搜索空闲链表寻找空间大于等于新对象大小 size 的块 block。如果它找到的块等于 size,会直接返回这个分块;如果找到的块大于 size,会将块分割成大小为 size 与 (block - size) 的两部分,返回大小为 size 的分块,并把大小为 (block - size) 的块返回给空闲链表。

不足:

  • 标记和清除过程效率都不高;
  • 会产生大量不连续的内存碎片,导致无法给大对象分配内存。

2.标记-整理

让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

优点:

  • 不会产生内存碎片

不足:

  • 需要移动大量对象,处理效率比较低。

3.复制

将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。

主要不足是只使用了内存的一半。

HotSpot 虚拟机的 Eden 和 Survivor 大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 就不够用了,此时需要依赖于老年代进行空间分配担保,也就是借用老年代的空间存储放不下的对象。

4.分代收集

现在的商业虚拟机采用分代收集算法,它根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。

一般将堆分为新生代和老年代。

  • 新生代使用:复制算法
  • 老年代使用:标记 - 清除 或者 标记 - 整理 算法

垃圾收集器

  • 单线程与多线程:单线程指的是垃圾收集器只使用一个线程,而多线程使用多个线程;
  • 串行与并行:串行指的是垃圾收集器与用户程序交替执行,这意味着在执行垃圾收集的时候需要停顿用户程序;并行指的是垃圾收集器和用户程序同时执行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行。

1.Serial收集器

以串行的方式执行,单线程的收集器,只会使用一个线程进行垃圾收集工作, Client 场景下的默认新生代收集器。

优点:简单高效(没有线程交互的开销)

2.ParNew收集器

是 Serial 收集器的多线程版本,Server 场景下默认的新生代收集器,只有它能与 CMS 收集器配合使用。

3.ParallelScavenge收集器

多线程收集器,是达到一个可控制的吞吐量,因此它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户程序的时间占总时间的比值。

高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。

缩短停顿时间是以牺牲吞吐量和新生代空间来换取的:新生代空间变小,垃圾回收变得频繁,导致吞吐量下降。

4.Serial Old收集器

Serial 收集器的老年代版本,也是给 Client 场景下的虚拟机使用。如果用在 Server 场景下,它有两大用途:

  • 在 JDK 1.5 以及之前版本(Parallel Old 诞生以前)中与 Parallel Scavenge 收集器搭配使用。
  • 作为 CMS 收集器的后备预案,在并发收集发生 Concurrent Mode Failure 时使用。

5.Parallel Old收集器

 Parallel Scavenge 收集器的老年代版本。

在注重吞吐量以及 CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge 加 Parallel Old 收集器。

6.CMS收集器

CMS(Concurrent Mark Sweep),Mark Sweep 指的是标记 - 清除算法。

分为以下四个流程:

  • 初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
  • 并发标记:进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。
  • 重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿。
  • 并发清除:不需要停顿。

在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。

具有以下缺点:

  • 吞吐量低:低停顿时间是以牺牲吞吐量为代价的,导致 CPU 利用率不够高。
  • 无法处理浮动垃圾,可能出现 Concurrent Mode Failure。浮动垃圾是指并发清除阶段由于用户线程继续运行而产生的垃圾,这部分垃圾只能到下一次 GC 时才能进行回收。由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure,这时虚拟机将临时启用 Serial Old 来替代 CMS。
  • 标记 - 清除算法导致的空间碎片,往往出现老年代空间剩余,但无法找到足够大连续空间来分配当前对象,不得不提前触发一次 Full GC。

7.G1收集器

是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。

堆被分为新生代和老年代,其它收集器进行收集的范围都是整个新生代或者老年代,而 G1 可以直接对新生代和老年代一起回收。

G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。

通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。
通过记录每个 Region 垃圾回收时间以及回收所获得的空间(这两个值是通过过去回收的经验获得),并维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。

每个 Region 都有一个 Remembered Set,用来记录该 Region 对象的引用对象所在的 Region。通过使用 Remembered Set,在做可达性分析的时候就可以避免全堆扫描。

如果不计算维护 Remembered Set 的操作,G1 收集器的运作大致可划分为以下几个步骤:

  • 初始标记
  • 并发标记
  • 最终标记:为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程的 Remembered Set Logs 里面,最终标记阶段需要把 Remembered Set Logs 的数据合并到 Remembered Set 中。这阶段需要停顿线程,但是可并行执行。
  • 筛选回收:首先对各个 Region 中的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分 Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率。

具备如下特点:

  • 空间整合:整体来看是基于“标记 - 整理”算法实现的收集器,从局部(两个 Region 之间)上来看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。
  • 可预测的停顿:能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在 GC 上的时间不得超过 N 毫秒。

 

 

 

 

深入理解 Java 虚拟机之垃圾收集 JVM 的垃圾收集机制通过可达性分析、分代收集和多样化的收集器,高效管理内存。串行适合小型应用,并行追求吞吐量,CMS 和 G1 优化停顿时间。理解 GC 原理和策略,有助于调优程序性能,避免内存溢出等问题。 阅读详情

相关推荐

Matlab路径文件pathdef.m可能为只读文件修改方法

找到MATLAB目录下的bin这个文件夹,直接改这个文件夹的权限(之前试过改pathdef.m的权限,不好用)如果到这里重新导入还是不行,从官网重新下载需要的安装包,可能是你的安装包出了问题。(Win11系统,matlab版本为2022b)编辑——添加——在输入对象名称来选择中输入everyone。重启matlab,以管理员身份运行。并修改其他已有的权限,都给它。

yqc1123的博客 1万+

Java虚拟机面试题:垃圾收集(下)

白色(White):尚未访问的对象。垃圾回收结束后,仍然为白色的对象会被认为是不可达的对象,可以回收。灰色(Gray):已经访问到但未标记完其引用的对象。灰色对象是需要进一步处理的。黑色(Black):已经访问到并且其所有引用对象都已经标记过。黑色对象是完全处理过的,不需要再处理。三色标记法的工作流程:①、初始标记(Initial Marking):从 GC Roots 开始,标记所有直接可达的对象为灰色。②、并发标记(Concurrent Marking)

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1247

高通CamX架构解析(一)——核心组件与数据流设计

本文深入解析高通CamX相机架构的核心组件与数据流设计。CamX采用模块化与数据驱动思想,将复杂处理流程拆解为Node、Pipeline、Session等独立组件,并通过CHI层实现硬件接口与定制功能的分离。文章详细阐述了从请求下发到结果返回的完整数据流,并提供了实用的调试与分析指南,帮助开发者理解这一高效、灵活的现代相机架构。

k8l9m0n的博客 235

Java 虚拟机原理 ——垃圾收集

Java 虚拟机技术是每个 Java 开发工程师都应该深入掌握的。本系列文章将深入介绍 JVM 相关技术,主要包括内存划分、对象创建回收与分配以及垃圾收集三大部分。本系列文章将力求全面概要地汇总核心知识点,并使知识点串联成面,以方便学习、工作以及备忘复习。本文将介绍第三部分——垃圾收集。 垃圾收集算法 标记清除算法 需要标记的对象非常多,效率一般不高 内存容易导致空间碎片化问题 标记整理算法 在标记清除算法基础上,增加内存整理功能,避免碎片化的问题 同样存在标记量大而效率不高的问题

qq_64513388的博客 1506

CCC数字钥匙3.0标准解读(16)

介绍通信过程最重要部分:身份认证和加密.介绍需要身份认证的过程和需要加密的数据及过程.

weixin_41738640的博客 1531

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

Java虚拟机垃圾收集器

JVM垃圾收集器: 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机(在这个版本中正式提供了商用的G1收集器,之前G1仍处于实验状态),这个虚拟机包含的所有收集器如下图所示。 图中展示了.

coolshyman的博客 907

提示libfakeroot.so或libfakeroot-sysv.so出错处理方法

嵌入式Linux、Buildroot交叉编译出现fakeroot问题处理方法。

阿xin*的嵌入式AI 1443

【Java虚拟机系列】- Java虚拟机垃圾收集器

为了能更好地适应不同程序的内存状况,HotSpot虚拟机并不是永远要求对象的年龄必须达到-XX:MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的⼀半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold中要求的年龄。在Java虚拟机中要避免大对象的原因是,在分配空间时,它容易导致内存明明还有不少空间时就提前触发垃圾收集,以获取足够的连续空间才能安置好它们;

m0_68383079的博客 826

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

Qt实现思维导图功能5『纵向分布模式』

思维导图纵向分布模式:模式一

浮生流年的博客 1055

Java虚拟机之垃圾收集(一)

每个对象维护一个引用计数器,被引用时计数器 +1,引用失效时 -1。:频繁 Full GC 会导致应用停顿(Stop-The-World),需谨慎使用。垃圾收集(GC)的核心是识别无用对象。无法解决循环引用问题(如对象 A 引用 B,B 也引用 A)。本地方法栈中 JNI 引用的对象(Native 方法)。Java 虚拟机内部对象(如系统类加载器、异常对象)。(STW):标记 GC Roots 直接关联对象。(STW):标记 GC Roots 直接关联对象。:熬过多次 GC 的对象难以消亡(老年代)。

JouJz的博客 1135

【C语言】初识C语言(上篇)

初识C语言第一部分

StackFrame 4004

一起学Java虚拟机(一):内存区域和垃圾收集

在Java堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些部分的区域 ——因而才有了“Minor GC”“Major GC”“Full GC”这样的回收类型的划分;也才能够针对不同的区域安排与里面存储对象存亡特征相匹配的垃圾收集算法。

2401_87167780的博客 2115

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 虚拟机垃圾收集机制简介

本文介绍Java虚拟机垃圾回收机制。以下内容总结来自于《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 垃圾收集机制 垃圾收集需要考虑三件事: 哪些内存需要回收? 什么时候回收? 如何回收? 回收对象 垃圾收集主要是针对Java堆和方法区进行 程序计数器、虚拟机栈和本地方法栈这三个区域只存在于线程的生命周期内,因此不需要对这三个区域进行垃圾回收 Java堆和方法区是线程共享的。在程序运行期间,一个接口的多个实现类所需内存可能大小不一样;一个方法中多个分支所需要的内存可能不一样;程序运行时

mg2flyingff的博客 300

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入Java虚拟机(五)垃圾收集

Java 虚拟机的堆里存放着程序运行中所创建的所有对象。虚拟机可以使用new、newarray、anewarray和multianewarray指令来创建对象,但是没有明确的代码来释放它们。垃圾收集就是自动释放不再被程序所使用的对象的过程。 本篇文章并不是要描述正式的 Java 垃圾收集器,因为根本不存在这样一个正式的描述。前面说过,Java 虚拟机规范不要求任何特定的垃圾收集技术,这根本不是必需的。但是在发明可以无限使用的内存前,大部分的 Java 虚拟机都会附带垃圾收集功能。 为什么要使用垃圾收集 垃圾

apigfly的博客 2765

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一文带你了解Java虚拟机垃圾收集器

在本篇内容中我们探讨了Java虚拟机中的垃圾收集器,首先介绍了分代收集算法的基本概念和优劣,并区分了分代收集与分区收集算法的主要区别。接着详细分析了几种常见的垃圾收集器,包括Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS以及G1等,它们各自采用不同的算法(如复制、标记-整理、标记-清除等)进行垃圾回收,并针对不同的应用场景提供了优化。

qq_37677132的博客 951

java虚拟机HotSpot中的垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机。这个虚拟机包含的所有收集器如下图所示:

不能说的秘密的博客 2734

Java虚拟机垃圾收集

  什么是根对象:         Java虚拟机的根对象集合根据实现不同而不同,但是总会包含局部变量中的对象引用和栈帧的操作数栈(以及变量中的对象引用)。根对象的来源之一是被加载的类的常量池中的对象引用,比如字符串。被加载的类的常量池可能指向保存在堆中的字符串,比如类名字,超类名字,超接口名字,字段名,字段特征签名,方法名或者方法特征签名。来源之二是传到本地方法中,没有被本地方法

rickhou的专栏 785

Java虚拟机垃圾收集器分析

jdk gc简介 常用的GC算法: 1)标记非活动对象 --何为非活动对象,通俗的讲,就是无引用的对象。 * 追踪root对象算法: 深度追踪root对象,将heap中所有被引用到的root做标志,所有未被标志的对象视为非活动对象,所占用的空间视为非活动内存。 2)清理非活动对象 * Copy算法: * 方法:将内存分为两个区域(from space和to space)。所有的对象分配内存都分配到from space。在清理非活动对象阶段,把

Edwin’s Blog 2605

java虚拟机之垃圾收集器篇

感觉好像作为一个android开发者java的垃圾收集器好像我没多大必要了解呢,毕竟android的收集器我们也配置不了,看着篇幅没多少我还是学习了,在这里做个记录。 这个是上面算法的具体实现 java虚拟机之垃圾回收篇 Serial收集器 Serial收集器是最基本、发展历史最悠久的收集器。是单线程的收集器。它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集完成。 Serial收集器依...

mr_x的博客 541

Java虚拟机垃圾收集算法概述

JVM虚拟机垃圾收集算法概述: 由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法 又各不相同,因此这里不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过 程。 1.标记-清除算法 最基础的收集算法是“标记-清除”( Mark-Sweep )算法,如同它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经介绍过了。之所以说它是最基础的收集算法,是因为

coolshyman的博客 224

深入理解Java虚拟机:垃圾收集算法

深入理解Java虚拟机:垃圾收集算法分代收集理论按照(新生代、老年代)GC区域进行划分部分收集新生代收集整体收集 分代收集理论 1)弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。 2)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。 从以上2个假说上,演化出了新生代和老年代,但是当老年代引用了新生代的对象的时候,就会导致新生代对象无法回收。此时就需要去除了遍历新生代对象还要遍

jj89929665的博客 363

Java虚拟机之垃圾收集器

文章目录Serial CollectorParallel CollectorConcurrent Collector并发标记清除(CMS)收集器G1 (Garbage-First 垃圾收集器)总结 写在前面 本文作为阅读了周志明作者的 <<深入理解Java虚拟机>> 的读书笔记。由于个人理解有限,本文摘抄的内容可能比较片面,强烈建议入手本书!本文还参考了 JDK 8 的相...

我与风来 338

Java 虚拟机垃圾收集机制详解

本文摘自深入理解 Java 虚拟机第三版 垃圾收集发生的区域 之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结束,内存自然也跟着回收了 而 Java 堆和方法区这两个区域则有显著的不确定性,只有在程序运行时我们才能知道程序究竟创建了哪些对象,创建了多少对象,所以这部分内存的分配和回收是动态的,垃..

whyrookie的博客 205
上一篇: Java虚拟机之运行时数据区域
下一篇: Java虚拟机之内存分配与回收策略
trytrylmt
博客等级 码龄9年 7粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值