【深入理解JVM】学习笔记——-3、垃圾收集器和内存分配策略

避开这些坑!智鼎MAP性格测试高分指南(附互联网/国企/外企答题模板) 本文深入解析智鼎MAP职业性格测试的核心逻辑与常见陷阱,提供针对互联网、国企、外企三大行业的差异化答题策略与实战模板。帮助求职者理解测试本质,避开追求完美人设、忽视程度副词等心理陷阱,塑造与目标岗位高度匹配的职业画像,从而在招聘关键环节脱颖而出。 阅读详情

你只管努力,

——剩下的交给时光。

首先我们带着问题来学习

Q1:哪些内存需要回收?

Q2:什么时候回收?

Q3:如何回收?

上一章我们说到JAVA内存运行时的各个部分,其实程序计数器、虚拟机栈、本地方法栈3个区域随线程而生随线程而灭。本章主要讨论的内存分配与回收指的就是这一部分的内存。

JAVA虚拟机的GC是自动回收内存,为什么我们还要去了解GC和内存分配?答案很简单:因为我们在日常的开发中都会遇到各种内存溢出泄漏等问题,说白了就是Exception报:OutOfMemoryError等错误你需要去排查吧,当系统达到更高并发量的瓶颈时,了解JVM中的GC有助于你更准更快的去定位到底哪里出了问题。从而去更好的解决它!以后只要实施必要的监控和调节就可以了。

正文:

1、对象已死吗?如何确定对象是否还“活着”

堆里面存放着JAVA中几乎所有的实例对象,GC在对堆进行回收前,首要做的就是判断这些对象中哪些还活着,哪些已经死了。  

引用计数器方法

一般我们判断对象是否还活着的算法是给对象添加一个应用法计数器,每当一个地方引用它时,计数器值+1,当引用失效时,计数器-1,为0时就是不可能再被使用的,

举个例子:

//对象A和对象B都有字段nama
objA.name=objB 
objB.name=objA

除此之外这两个对象再无引用,但是互相引用,那么他们的计数器就不为0,所以计数器算法无法通知GC回收他们。

  • 给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1,当引用失效时,计数器就减1。
  • 优点是判定简单,效率也很高。缺点是无法解决相互循环引用的问题

  可达性分析方法

  • 通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC Roots没有任何引用链相连时,说明这个对象是可回收的。
  • Java语言中,可作为GC Roots的对象包括以下几种:虚拟机栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象。

   再谈引用

  • JDK1.2 之后把引用分为了四种:强引用、软引用、弱引用、虚引用
  • 强引用:只要强引用还存在,就不会被垃圾回收器回收。类似 Object o=new Object()
  • 软引用:指一些有用但并非必须的对象,在系统将要发生内存溢出的时候,会将这部分对象回收。SoftReference 类来实现软引用
  • 弱引用:被弱引用关联的对象只能生存到下一次垃圾回收。WeakReference 类来实现弱引用
  • 虚引用:一个对象是否有虚引用的存在,完全不会对其生存时间造车影响,也无法通过虚引用取得对象的引用。一个对象设置虚引用的唯一目的是在被垃圾回收的时候收到一个系统通知

   对象被回收的过程

  • 当对象进行可达性分析没有与GC Roots相连的引用链,将会被第一次标记,并根据是否需要执行finalize()方法进行一次筛选,对象没有重写finalize()或者虚拟机已经调用过finalize(),都被视为不需要执行
  •  如果对象有必要执行finalize,会被放入到F-Queue队列中,并在稍后由虚拟机自动创建的低优先级的Finalizer线程去触发它,并不保证等待此方法执行结束。
  • 如果对象在finalize()方法执行中,重新和GC Roots产生了引用链,则可以逃脱此次被回收的命运,但finalize()方法只能运行一次,所以并不能通过此方法逃脱下一次被回收
  • 笔者不建议使用这个方法,建议大家完全忘掉这个方法的存在。

   回收方法区

  • 主要包括废弃常量和无用类的回收。判断类无用:类的实例都被回收,类的ClassLoader被回收,类的Java.Lang.Class对象没有在任何地方引用。满足这三个条件,类才可以被回收(卸载)
  •  HotSpot虚拟机通过 -Xnoclassgc 参数进行控制是否启用类卸载功能。在大量使用反射、动态代理、CGLib等框架,需要虚拟机具备类卸载功能,避免方法区发生内存溢出

2、垃圾回收算法

  标记-清除算法

  • 先标记出所有要回收的对象,在标记完成后统一进行对象的回收。有两个不足:

       1 是效率问题,标记和清除的效率都不高。

       2 是空间问题,会产生大量不连续的内存碎片,碎片太多会都导致大对象无法找到足够的内存,从提前触发垃圾回收。

  复制算法

  • 新生代分为一个Eden,两个Survival空间,默认比例是8:1。回收时,将Eden和一个Survival的存活对象全部放入到另一个Survival空间中,最后清理掉刚刚的Eden和Survival空间
  •  当Survival空间不够时,由老年代进行内存分配担保

  标记-整理算法

  • 根据老年代对象的特点,先标记存活对象,将存活对象移动到一端,然后直接清理掉端边界以外的对象

  分代收集算法

  • 新生代采用复制算法,老年代采用标记-删除,或者标记-整理算法。

3、HotSpot算法实现

  枚举根节点实现

  • 可达性分析时会进行GC停顿,停顿所有的Java线程。
  • HotSpot进行的是准确式GC,当系统停顿下来后,虚拟机有办法得知哪些地方存在着对象引用,HotSpot中使用一组称为OopMap的数据结构来达到这个目的

  安全点

  • HotSpot没有为每个指令都生成OopMap,只在特定的位置记录这些信息,这些位置称为安全点。安全点的选定不能太少,也不能太频繁,安全点的选定以“是否让程序长时间执行”为标准
  • 采用主动式中断的方式让所有线程都跑到最近的安全点上停顿下来。设置一个标志,各个程序执行的时候轮询这个标志,发现中断标志为真时自己就中断挂起

  安全区域

  • 解决没有分配Cpu时间的暂时不执行的程序停顿。

4、垃圾收集器

              如果两个收集器之间有连线,说明可以搭配使用。没有最好的收集器,也没有万能的收集器,只有对应具体应用最合适的收集器。

     

  Serial 收集器

  • 新生代收集器,单线程回收。优点在于,简单而高效,对于运行在Client模式下的虚拟机来说是一个很好的选择(比如用户的桌面应用)
  • 参数 -XX:UseSerialGC,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收

  ParNew收集器

  • 新生代收集器,Serial的多线程版本,除了Serial收集器之外,只有它能与CMS收集器配合工作。
  • -XX:+UseConcMarkSweepGC 选项后默认的新生代收集器,也可以使用 -XX:+UseParNewGC 选项来强制指定它
  • ParNew收集器在单CPU的环境中,效果不如Serial好,随着CPU的增加,对于GC时系统资源的利用还是很有效的。
  • 默认开启的收集线程数和CPU数相等,可以使用 -XX:ParallelGCThreads 指定

  Parallel Scavenge收集器

  • 新生代收集器,并行收集器,复制算法,和其他收集器不同,关注点的是吞吐量(垃圾回收时间占总时间的比例)。提供了两个参数用于控制吞吐量。
  • -XX:MaxGCPauseMillis,最大垃圾收集停顿时间,减少GC的停顿时间是以牺牲吞吐量和新生代空间来换取的,不是设置的越小越好
  • -XX:GCTimeRatio,设置吞吐量大小,值是大于0小于100的范围,相当于吞吐量的倒数,比如设置成99,吞吐量就为1/(1+99)=1%。
  • -XX:UseAdaptiveSizePolicy ,这是一个开关参数,打开之后,就不需要设置新生代大小(-Xmn)、Eden和Survival的比例(-XX:SurvivalRatio)、 晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数,收集器会自动调节这些参数。

  Serial Old 收集器

  • 单线程收集器,老年代,主要意义是在Client模式下的虚拟机使用。在Server端,用于在JDK1.5以及之前版本和Parallel Scavenge配合使用,或者作为CMS的后备预案。

  Palallel Old 收集器

  • 是Parallel Scavenge的老年代版本。在注重吞吐量的场合,都可以优先考虑Parallel Scavenge 和Palallel Old 配合使用

  CMS 收集器

  • Concurrent Mark Sweep,是一种以获取最短回收停顿时间为目标的收集器,尤其重视服务的响应速度。基于标记-清除算法实现。
  • 分为四个步骤进行垃圾回收:初始标记,并发标记,重新标记,并发清除。只有初始标记和重新标记需要停顿。
  • 初始标记只是标记一下GC Roots能直接关联到的对象,速度很快。并发标记就是进行GC Roots的Tracing。
  • 重新标记为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会比初始标记阶段稍长,远比并发时间短。
  • 耗时最长的并发标记和并发清除过程中,处理器可以与用户线程一起工作。
  • 它并不是完美的,有如下三个比较明显的缺点:

     1、垃圾回收时会占用一部分线程,导致系统变慢,总吞吐量会降低。

     2、无法处理浮动垃圾,需要预留足够的内存空间给用户线程使用,可以通过 -XX:CMSInitiatingOccupancyFraction 参数控制触发垃圾回收的阈值。

       如果预留的内存无法满足程序需要,就会出现“Concurrent Mode Failure”失败,这时将启动应急预案,启用Serial Old 进行垃圾回收,停顿时间会变长

       所以-XX:CMSInitiatingOccupancyFraction 参数的值设置的太高,会导致频繁“Concurrent Mode Failure”失败,性能反而降低。

     3、标记-清理,容易产生内存碎片。-XX:+UseCMSCompactAtFullColletion 开启碎片整理功能,默认开启,-XX:CMSFullGCsBeforeCompaction,控制多少次不压缩的FullGC之后来一次带压缩的

  G1 收集器

  • 包括新生代和老年代的垃圾回收。和其他收集器相比的优点:并行和并发,分代收集,标记-整理,可预测的停顿。垃圾回收分为以下几个步骤:
  • 初始标记:标记GC Roots能够直接关联到的对象,这阶段需要停顿线程,时间很短
  • 并发标记:进行可达性分析,这阶段耗时较长,可与用户程序并发执行
  • 最终标记:修正发生变化的记录,需要停顿线程,但是可并行执行
  • 筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来执行回收计划

5、内存分配和回收策略

  • 对象优先在Eden分配,当新生区没有足够的内存是,通过分配担保机制提前转移到老年代中去
  • 大对象直接进入老年代。大对象是指需要大量连续内存空间的对象,虚拟机提供了参数 -XX:PretenureSizeThreshold(只对Serial,PerNew两个回收器起效),令大于这个值得对象直接在老年代分配,避免了Eden和两个Survival之间发生大量的内存复制。
  • 长期存活的对象将进入老年代。虚拟机给每个对象定义了对象年龄计数器(Age),如果对象在Eden出生,经过第一次Minor GC后依然存活,并且能被Survival容纳的话,将被移动到Survival,对象年龄设为1。对象在Survival中每熬过一次Major GC,年龄就增加1,达到一定程度(默认是15),就会被晋升到老年代。对象晋升老年代的阈值,可以通过参数-XX:MaxTenuringThreShold 指定
  • 动态对象年龄判断。如果在Survival空间中相同年龄所有对象的大小综合超过了Survival空间的一半,年龄大于等于这个年龄的对象都会被晋升到老年代。无需等待年龄超过MaxTenuringThreShold指定的年龄
  • 空间分配担保。只要老年代的连续空间大于新生代对象总和或者历次晋升的平均大小,就进行Major GC,否则进行Full  GC。
iOS开发者必备:从越狱设备里提取IPA的三种方法(含Filza、iTools实战) 本文详细介绍了iOS开发者从越狱设备提取IPA文件的三种实用方法,包括使用Filza文件管理器、AFC2配合桌面工具以及命令行高级技术。内容涵盖环境准备、操作步骤和技术原理,帮助开发者高效获取应用包文件,适用于逆向工程、测试分析等场景。 阅读详情

相关推荐

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1950

江的福的小本本之JVM常用基本配置参数

-Xms:初始大小内存,默认为物理内存的1/64。 等价于-XX:InitialHeapSize -Xmx:最大分配内存,默认为物理内存的1/4。 等价于-XX:MaxlHeapSize -Xss:设置单个线程栈的大小,一般默认为512k~1024k。 等价于-XX:ThreadStackSize 这个大小是依赖于平台的。 -Xmn:新生区年轻代的大小。(很少情况下会调) -XX:M...

江的福,安杰喊你敲代码啦!~ 354

Matlab:imageDatastore() 高效读取图像数据集的实战技巧

本文详细介绍了Matlab中imageDatastore()函数的高效使用技巧,帮助用户从繁琐的手动读取图像数据集中解放出来。通过核心语法、关键参数(如IncludeSubfolders、LabelSource、ReadSize)的解析,以及数据集分割、打乱等进阶实战操作,指导读者构建稳定、高效的图像数据读取管道,特别适用于大型图像数据集处理和机器学习项目。

hill8的博客 1101

JVM常用基础参数SurvivorRatio详解

SurvivorRatio作用讲解 Java堆从GC的角度, 可以分为 新生代和老年代。 新生代中可以分为伊甸园区(Eden区),From Survivor 区 (S0区)和 To Survivor 区 (S1区)。 占用的空间分别默认为 8:1:1 具体的内容可以看下图 一般默认用 8:1:1的比例, 而SurvivorRatio就是用于调整这个比例的。 SurvivorRatio代码实战 使用如下的测试代码, public class MyHelloGc { public static v

Java持续实践 2万+

Innovus Function ECO实战:5步搞定数字后端设计中的网表修正(含Calibre LVS验证技巧)

本文提供了一份完整的Innovus Function ECO实战指南,详细解析了数字后端设计中网表修正的五步流程。从理解Function ECO概念、准备关键文件,到在Innovus中执行逻辑比对、自动布线及GUI检查,并重点攻克了ECO后Calibre LVS验证的难点与调试技巧,帮助工程师高效、精准地完成流片前的设计微调。

day7的博客 949

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

《深入理解Java虚拟机:JVM高级特性与最佳实践》读书笔记

第一部分 走进Java 一、走进Java 1、概述   java广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想 2、java技术体系结构   按照功能来划分 包括以下几个组成部分:Java程序设计语言,各种硬件平台的java虚拟机,Java API类库,来自商业机构和开源社区的第三方Java类库,Class文...

weixin_30568715的博客 302

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1417

【JVM调优系列】----NewRatio与SurvivorRatio

-XX:NewRatio 新生代(Eden + 2*S)与老年代(不包括永久区)的比值 4 表示新生代 :老年代 = 1:4 ,意思是老年代占 4/5 -XX:SurvivorRatio 2个Survivor区和Eden区的比值 8 表示 两个Survivor : Eden = 2: 8 ,每个Survivor占 1/10 ...

令仔很忙 1万+

DSP(数字信号处理器)技术概要

数字信号处理器(digital signal processor,DSP)是一种用于数字信号处理的可编程微处理器,它的诞生与快速发展,使各种数字信号处理算送得以实时实现,为数字信号处理的研究和应用打开了新局面,提供了低成本的实际工作环境和应用平台,推动了新的理论和应用领域的发展。目前,DSP技术在通信、航空、航天。雷达、工业控制、医疗、网络及家用电器等各个领域都得到了广泛应用。 1.1 DSP系统和芯片的结构特点1.1.1 DSP系统的基本结构通过传感数将非电物理量转换为模拟电信号,预处理一般包括放大器和滤

m0_46582485的博客 2万+

109. 使用 SAP UI5 FileUploader 控件上传本地文件

我们可以使用SAPUI5提供的控件,将本地文件上传到远端服务器进行存储。远端服务器负责接收上传的文件的逻辑,可以采取Java,Node.js或者ABAP等任意的编程语言实现。本地文件上传也是最终用户同文件服务器交互的重要手段之一,因此文件上传这个主题,本教程会通过若干篇文章连续进行介绍。笔者还另外实现了一个不通过SAPUI5FileUploader控件,而是直接用HTML原生的input。先看本步骤完成后实现的场景。本步骤完整的源代码位置。进入目录109,运行命令行。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2236

java OOM内存异常的四种类型及异常与解决方案

       OOM异常的四种类型:       一: StackOverflowError :通常因为递归函数引起(死递归,递归太深)。-Xss 128k 一般够用。        二: out Of memory: PermGen Space:通常是动态类大多,比如web 服务器自动更新部署时引起。-Xmx 256M,一般够用。JDK 8 没有PermGen Space,相对应是Me...

ronon77的专栏 1027

SAP PCE 到底有没有 AI 能力:从标准功能、Joule、ABAP 扩展到项目落地的完整解读

摘要:SAP S/4HANA Cloud Private Edition(PCE)已深度集成AI能力,主要体现在三个方面:1)标准业务流程中的AI辅助功能(如财务分录生成、维修单据处理);2)通过Joule提供的自然语言交互入口,支持业务导航和部分事务处理;3)开发者可通过ABAP AI SDK与BTP平台集成实现扩展。PCE不是独立AI平台,企业级自定义AI需结合SAP BTP实现。AI能力已深度融入财务、制造等业务场景,但关键业务仍需人工审核。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 330

深入理解JVM学习笔记:第3章 垃圾收集器与内存分配策略

回收java堆:怎么确定对象可回收? 引用计数算法:      给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。缺点是无法解决对象之间相互循环引用的问题。 可达性分析算法:       以一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Ref...

qq_42283110的博客 417

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深入理解JVM垃圾收集器与内存分配策略

在Java虚拟机中,“垃圾”指的是内存中不再使用或不可达的对象。垃圾收集器(GC)的主要任务就是识别并回收这些垃圾对象,释放内存资源。在JVM中,垃圾收集器管理的是堆(Heap)和方法区(Method Area)中的对象,它们的生命周期是动态的,需要在运行时进行分配和回收。JVM的垃圾收集机制通过多种垃圾收集算法和策略来优化内存回收,提升程序性能。理解不同垃圾收集器的特点及内存分配策略,能够帮助开发者更好地管理Java应用的内存,减少垃圾回收带来的性能损耗。

dm菜鸟编程的专栏 1214

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略

但是会存在跨代引用的情况,即新生代中对象有可能被老年代所引用,实际情况中,存在互相引用的对象是偏向于同时存活或同时消亡的(被老年代引用的对象在收集时会存活下来然后晋升到老年代),根据第三个假说,为了避免检查跨代引用时扫描整个老年代,可以建立一个记忆集,把老年代划分成若干小块并标识出哪块存在跨代引用,在发生新生代收集时,只有包含跨代引用的块会被加入到GC Roots扫描。冒险:把Survivor无法容纳的对象直接送入老年代,前提是老年代有空间容纳这些对象,但不确定被容纳的对象其中有多少能在回收中存活下来。

Oceáno的博客 1822

如何查看JVM使用的是什么垃圾收集器

本文介绍了如何查看JVM使用的垃圾收集器。然后又通过代码验证了一下大对象的内存分配策略:了解了什么情况下大对象会直接进入老年代。

长路漫漫,以勤作车 3300

《深入理解Java虚拟机》 垃圾收集器与内存分配策略

垃圾收集的重要性:垃圾收集(Garbage Collection, GC)是Java虚拟机自动内存管理的核心机制,可以自动回收不再使用的内存,避免内存泄漏和内存溢出问题。垃圾收集的目标:最小化停顿时间、最大化吞吐量、最小化内存占用。

vesqis的博客 571

深入理解 JVM——垃圾收集器

程序计数器、虚拟机栈、本地方法栈3个区域随线程而生/灭,每一栈帧中分配多少内存基本是在类结构确定下来时就已知的,这几个区域的内存分配和回收都具备确定性,方法或线程结束后内存自然就随着回收了。 而Java堆和方法区显然是不确定的,只有运行期间,才能知道程序创建哪些对象,这部分内存的分配和回收是动态的。

weixin_52344200的博客 717

【深入理解JVM】垃圾收集器&内存分配策略

那么虚拟机要进行GC的时候,就不会管这些已经运行到安全区域的线程,当线程要脱离安全区域的时候,要自己检查系统是否已经完成了GC或者根节点枚举(这个跟GC的算法有关系),如果完成了就继续执行,如果未完成,它就必须等待收到可以安全离开安全区域的Safe Region的信号为止。简单解释一下,当线程1,线程2 是两个十分耗时的循环,并且根据HotSpot放置安全点的位置来说,上一段代码是典型的 counted loop(可数循环),也就是说每次循环回跳前是不会放置安全点的。所以这里就引入了安全点的概念。

fanday的博客 563

JVM内存分配策略

本篇内容来自深入理解java虚拟机_JVM高级特性和最佳实践 JVM内存分配策略 java的内存自动管理可以总结为自动分配和自动回收内存。 对象内存的分配主要是在堆上分配内存,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程有限分配在TLAB上。少数情况可以直接分配在老年代中。 TLAB技术:JVM在内存新生代Eden Space中开辟了一小块线程私有的区域,称作TLAB(...

lidongxiu0714 3114

[jjzhu学java]之深入理解JVM之垃圾收集器与内存分配策略

深入理解JVM之垃圾收集器与内存分配策略 如何判断对象已经消亡 引用计数算法 根搜索算法 深入理解JVM之垃圾收集器与内存分配策略 java中对象的创建需要的内存都是在java堆中申请的,所以垃圾收集的区域就是对java堆和方法区的内存区域进行GC。 如何判断对象已经消亡 垃圾收集器的主要任务就是找出已经“消亡”的对象,将其标记并清除其说用内存的过程,如何判断某个对象已

jjzhu_zju的博客 615

深入理解JVM - 垃圾收集器与内存分配策略

上一篇介绍了Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程生而生,随线程灭而灭;栈中的栈帧随着方法的进入和退出而有条不紊的执行入栈和出栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就是已知的。因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多的考虑内存回收的问题,因为随着方法或线程的结束,这些内存自然就回收了。 而Java堆和

json_it的博客 1688

细说JVM(垃圾收集器与内存分配)

一、基础性的概念 1、Minor GC 和 Full GC 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。 老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scav...

啦啦啦的博客 511

第3章 垃圾收集器与内存分配策略《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

Java世界中的所有对象实例,垃圾收集器进行回收前就是确定对象哪些是的,哪些已经。

输入知识,消化知识,输出知识,分享知识,教人让我学习更好,业精于勤荒于嬉,行成于思毁于随 1564

深入理解Java虚拟机-垃圾收集器与内存分配策略

内存分区:将堆划分为多个等大的Region(1MB~32MB),每个Region可属于Eden、Survivor、Old或Humongous(大对象区)并发标记(Concurrent Mark):遍历对象图,标记可达对象(与用户线程并发)适用场景:大内存(6GB以上)、多核CPU,需平衡吞吐量与延迟(如大数据平台)并发清除(Concurrent Sweep):回收垃圾对象(与用户线程并发)老年代(Parallel Old):多线程标记-整理算法。重新标记(Remark):修正并发标记期间的变化(STW)

m13299531475的博客 1051

【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略

p128~P129。

Lchen_kk的博客 849
上一篇: 排序算法Java实现——桶排序
下一篇: Eclipse字体大小设置
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值