JVM-内存分配策略和垃圾回收策略

【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出 一、前言最近要准备找工作,JVM肯定是跑不掉的面试内容,所以把JVM相关的内容拿来认真学习一遍,整理成自己能够快速消化的提纲,方便随时可以调用。主要分JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略 四个方面展开。二、JVM结构JVM的内部结构直接贴图: 各部分的主要功能: 类加载器 JVM启动,程序开始执行时,负责将class字节码加载到JVM内存区域中 执行引擎 负责 阅读详情

对什么区域进行垃圾回收?

  • 1.堆
  • 2.方法区中静态属性引用的对象
  • 3.方法区中常量引用的对象
  • 4.本地方法栈中JNI引用的对象
    例如: private native void sort(int[] array);

栈是线程私有的,不需要回收

什么情况下回收?

  • 1.当引用计数器为0(循环调用则会出问题)
  • 2.可达性分析遍历不到的对象进行回收.

四种引用:

  • 强引用:可达性分析不可达的情况下,会被GC
  • 软引用:内存不足时,会被GC
  • 弱引用:只能存活到下一次GC前
  • 虚引用:不会对对象的生命周期有任何影响,无法通过它获取对象实例,唯一的作用就是在对象被GC回收前收到一个通知.

JVM内存分配策略:

1.对象优先在Eden分配

大多数情况下,对象在新生代Eden区中分配。

2.大对象直接进入老年代

大对象是指,需要大量连续内存空间的java对象(字符串,数组).-XX:PretenureSizeThreshold可以令大于这个值的对象直接在老年代分配内存,可以避免在Survivor区域发生大量的内存复制.

XX:PretenureSizeThreshold 该参数只能在ParNew和Serial两款收集器使用.

3.动态对象年龄判断

如果Survivor空间中的相同年龄的所有对象大小的总和大于Survivor空间的一半,大于该年龄的对象直接进入老年代.

4.长期存活的对象将进入老年代

对象在Survivor每熬过一次GC,对象年龄就会加1,当年龄到达默认值15,则进入老年代

5.空间分配担保

检测老年代的可用连续空间是否大于即将晋升到老年代的对象的大小,如果大于,则进行一次MinorGC,如果小于,或者设置不允许冒险,那次时需进行一次FullGC.

垃圾回收算法:

1.标记-清除算法

分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.
在这里插入图片描述
缺点:

  • 效率不高
  • 会产生不连续的内存碎片,空间碎片太多可能会导致以后在程 序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作

2.复制算法

将可用内存分为大小相等的两个区域,每次只使用其中一片区域.当这一片区域用完了,再将还活着的对象复制到另一块区域,将之前区域的对象清理掉.
在这里插入图片描述

缺点:

  • 1.内存缩小为原来的一半,内存利用率太低
  • 2.如果对象存活率高,复制浪费时间

3.标记-整理法

分为标记和整理两个阶段,先标记出所有需要回收的对象,然后将存活对象整理到内存的一端.然后清除回收的对象
在这里插入图片描述

4.分代回收算法

  • 年轻代采用标记清除和整理算法
  • 老年代采用复制算法

在新生代 中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就使用“标记—整理”算法来进行回收。

什么是STW?

STW(Stop The World):正常执行的用户线程全部停止.

精确式GC:

HotSpot===>OopMap

准确式GC,当执行系统停顿下来后,并不需要一个不漏地检查完所有 执行上下文(例如栈帧中的本地变量表)和全局(例如常量或类静态属性)的引用位置,虚拟机应当是有办法直接得知哪些地方存放着对象引用。在 HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样,GC在扫描时就可以直接得知这些信息了。

savepoint :安全点

在OopMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举,但一个很现实的问 题随之而来:可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一 条指令都生成对应的OopMap,那将会需要大量的额外空间,这样GC的空间成本将会变得很 高。实际上,HotSpot也的确没有为每条指令都生成OopMap,前面已经提到,只是在“特定的 位置”记录了这些信息,这些位置称为安全点(Safepoint),即程序执行时并非在所有地方都 能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以致于让 GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷.

对于Sefepoint,另一个需要考虑的问题是如何在GC发生时让所有线程(这里不包括执行 JNI调用的线程)都“跑”到最近的安全点上再停顿下来。有两种方式:

抢先式中断:

先将线程主动中断,没有执行到指定安全点的据需执行,直到安全点.(用得少,几乎没有)
缺点:
Thread.sleep() wait(),有可能跑不到中断点.

主动式中断:

当GC需要中断线程时,不直接对线程进行操作,而是设置一个标志,让用户线程去检查,然后中断.

安全区:

使用Safepoint似乎已经完美地解决了如何进入GC的问题,但实际情况却并不一定。 Safepoint机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的Safepoint。但是, 程序“不执行”的时候呢?所谓的程序不执行就是没有分配CPU时间,典型的例子就是线程处 于Sleep状态或者Blocked状态,这时候线程无法响应JVM的中断请求,“走”到安全的地方去 中断挂起,JVM也显然不太可能等待线程重新被分配CPU时间。对于这种情况,就需要安全 区域(Safe Region)来解决。 安全区域是指在一段代码片段之中,引用关系不会发生变化。在这个区域中的任意地方 开始GC都是安全的。

垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
连线表示可以搭配使用.
在这里插入图片描述

Serial收集器(新生代收集器)

在这里插入图片描述

开启参数:-XX:+UseSerialGC

单线程的收集器,"单线程"的意义并不仅仅说明他只会使用一个CPU或者一条收集线程去完成收集垃圾操作,最重要的是他在进行垃圾收集的时候,必须暂停其他线程的工作,直到它收集结束.新生代和老年代都会Stop The World.
就好比: “你妈妈在给你打扫房间的时候,肯定也会让你老老实实地在椅子上或者房间 外待着,如果她一边打扫,你一边乱扔纸屑,这房间还能打扫完?”

ParNew收集器(新生代收集器)

在这里插入图片描述

Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为还包括Serial收集器的可用控制参数
(-XX:SurvivorRatio , -XX:PretenureSizeThreshold ,-XX:HandlePromotionFailure),收集算法,Stop The World,对象分配规则,回收策略等都与Serial收集器完全一样.

对新生代并行收集,对老年代还是单线程收集.

Parallel Scavenge收集器(新生代收集器)

开启参数:-XX:+UseParallelGC

Parallel Scavenge关注点: 可控的吞吐量 (与ParNew相比可控制GC时用户现场停顿时间)
吞吐量计算公式: 运行用户代码时间/(运行用户代码时间+垃圾收集时间) 例:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%

停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效的利用CPU时间,尽快完成程序的运算任务

Parallel Scavenge提供参数用于精确控制吞吐量

  • -XX:MaxGCPauseMills //最大垃圾收集停顿时间,收集器将尽可能地保证内存回收花费的时间不超过设定值
  • -XX:GCTimeRatio //吞吐量大小,也就是垃圾收集时间占总时间的比率,相当于是吞吐量的倒数
  • -XX:+UseAdaptiveSizePolicy //内存调优委托给虚拟机管理,这是一个开关参数,当这个参数打开之后,就不需要手工指定新生代的大小(-Xmn)、 Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX: PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信 息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种调节方式称为GC 自适应的调节策略。

Serial Old收集器(老年代收集器)

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。

图可看Serial收集器

Parallel Old (老年代的多线程版本)

在这里插入图片描述

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法

CMS(Concurrent Mark Sweep)收集器

在这里插入图片描述
开启: -XX:+UseConcMarkSweepGC

(CMS收集器是一种以获得最短回收停顿时间为目标的收集器.CMS收集器是基于标记清除算法实现的.整个过程分为4个步骤:

  • 初始标记(CMS initial Mark) :标记一下GC Roots能直接关联到的对象(GCRoot和它的子节点),速度很快
  • 并发标记(CMS concurrent Mark) :对未标记的节点进行标记
  • 重新标记(CMS Remark) :修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
  • 并发清除(CMS concurrent sweep) : 最后进行对象清除
    在初始标记和重新标记会STW

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起 工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS默认回收的线程= (CPU数量+3)/4

3个明显的缺点:

  • CMS收集器对CPU资源非常敏感
    在并发标记的时候,占用了一部分线程(CPU资源)导致应用程序变慢

  • CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
    由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法 在当次收集中处理掉它们,只好留待下一次GC时再清理掉。

  • 有大量空间碎片产生
    因为该收集器是基于标记-清除算法实现的.所以会意味着产生大量空间碎片.

    • 为了解决这个问题,CMS收集器提供了一个-XX:+UseCMSCompactAtFullCollection开 关参数(默认就是开启的),用于在CMS收集器顶不住要进行FullGC时开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片问题没有了,但停顿时间不得不变长。
    • 还提供了另外一个参数-XX:CMSFullGCsBeforeCompaction,这个参数是用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值为0,表示每次进入Full GC时都进行碎片整理)。

G1收集器(Gabage First)

在这里插入图片描述

G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者 CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的 GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。

G1收集器之所以能建立可预测的停顿时间模型,是因为它可以有计划地避免在整个Java 堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的 空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也就是Garbage-First名称的来由)。这种使用Region划分 内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高 的收集效率。

仍然属于分代收集器,只不过将内存划分为多个Regin
特点: 空间整合
算法: 既属于标记整理,又属于复制

分为四个阶段:

  • 初始标记阶段:
    仅仅只是标记一下GC Roots能直接关联到的对象,并且修改 TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可用的 Region中创建新对象,这阶段需要停顿线程,但耗时很短。
  • 并发标记阶段:
    是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行。
  • 最终标记阶段:
    为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,这阶段需要停顿线程,但是可并行执行。
  • 筛选回收阶段:
    首先对各个Region的回收价值和成本进行排序, 根据用户所期望的GC停顿时间来制定回收计划,这个阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。

Young GC:
1.扫描根GCRoots
2.更新RememberSet记录回收对象的数据结构
3.检测RememberSer哪些是要从年轻代到老年代的
4.Copy对象,要么去to区,要么去老年代
5.清理工作
MixedGC

与其他GC收集器相比,G1具备如下特 点。

  • 并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者 CPU核心)来缩短Stop-The-World停顿的时间
  • 分代收集:与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已 经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。
  • 空间整合:与CMS的“标记—清理”算法不同,G1从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,但无论如何,这 两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种 特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一 次GC。
  • 可预测的停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关 注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一 个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒.
在Simulink中实现一个基于SiC MOSFET的高效率电机驱动系统 本文介绍了在Simulink中构建基于SiC MOSFET的高效率电机驱动系统的详细流程。系统由直流电源模块、SiC MOSFET逆变器模块、PMSM电机模型、控制策略模块(包括矢量控制和PWM生成)以及反馈测量模块组成。文章逐步指导了从模型创建到参数设置的完整过程,包括各模块的具体实现方法。通过仿真可以评估系统在不同负载条件下的响应速度、效率、功率密度等性能指标。该建模方法为电机驱动系统的设计和优化提供了有效工具,同时建议根据实际硬件规格和工程需求进行参数调整和定制化开发。 阅读详情

相关推荐

非球面检测

摘要:非球面镜检测主要采用干涉法,包括零位补偿和非零位补偿两种方式。零位补偿通过透镜组完全校正像差,精度达1%波长,但设计复杂成本高;非零位补偿利用部分像差补偿降低波前斜率,适用于规则非球面。折射-衍射混合补偿镜能同时校正多种像差。实际检测中可采用物理补偿镜或动态CGH加载方案,光路设计需运用坐标断点和多重结构技术实现复杂光路建模。不同方法各具优势,需根据检测需求选择合适方案。

Zhaxibamao的博客 2113

JVM四:垃圾收集算法+HotSPot的算法实现

垃圾收集算法分为标记清除,复制算法,标记整理,下面我们来看看这三种基础的收集算法。 标记-清除算法:分为两个阶段,标记和清除阶段。    首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。标记过程与上一章的过程一样。这种标记算法的由两个不足;一是效率问题,标记和清除两个阶段的效率都不高;二是会产生空间碎片,空间碎片太多可能会导致以后在程序运行时无法分配较大的对象。导致再一次触...

weixin_40234548的博客 306

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2542

jvm完全解读加吐血整理之垃圾回收

一 JVM垃圾回收模型 一. GC算法 1.1 标记-清除算法(Mark-Sweep) 算法分为“标记”和“清除”两个阶段首先标记出所有需要回收的对象,然后回收所有需要回收的对象。 问题:效率不高,需要扫描所有的对象,堆越大,GC越慢,并且存在严重的内存碎片问题,空间碎片太多可能会导致后续使用中无法找到足够的连续内存而提前触发另一次的垃圾搜集动作,GC次数越多,碎片越严重。 示例如下,红色的就是未被标记要回收的,并且红色的区域被回收之后,绿色的还在“原地”,并不会对内存区域进行整理。 15827875618

weixin_43390345的博客 537

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

jvm的SafePoint

垃圾收集通常会导致stop the world,但并不是stop the world的唯一途径,应该说应用程序只要到达safepoint就会触发stop the world。 safe point 在到达safe point后,jvm里的所有工作的应用线程都会被挂起,只有垃圾收集的native线程会持续不断地跑。 因为只有保证垃圾收集线程对jvm中地数据结构具有独占式的访问权限,它才能够做一些诸如标记GC Root 或是 移动堆中对象之类 或是 替换方法栈中的方法 之类的操作。 safe po.

stay foolish 1219

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

JVM(三)----垃圾收集算法及Safe Point介绍

JVM(一)---- 总结与专题目录 JVM(二)----Java运行时数据区域 JVM(三)----垃圾收集算法及Safe Point介绍 JVM(四)----HotSpot的垃圾收集器与内存分配回收策略 JVM(五)----虚拟机类加载机制 本文的内容如下: 如何判断对象是否存活 强软弱虚引用 垃圾收集算法 HotSpot的算法实现 safe point 和safe regi...

LifeIsGood 500

全栈拆解华为乾崑 ADS 5:WEWA2.0智能体架构与安全风险场技术、实现多传感器全融合感知与主动安全预判、助力城市NOA/高速领航/全场景无人通行极致落地

华为乾崑ADS 5的核心颠覆性,不在于单一功能的小幅升级,而在于实现了自动驾驶从“工具式辅助驾驶”到“拟人化智能体驾驶”的全栈范式革命。通过WEWA 2.0端云协同AI智能体架构,解决了传统智驾决策僵硬、博弈能力弱、学习效率低的行业痛点;通过行业首发安全风险场技术,将自动驾驶安全体系从被动避险升级为主动预判,直接减半行车风险;通过乾崑OS专属车规系统底座,保障高阶智驾的低时延、高稳定、高可靠运行;通过多传感器超融合感知体系,实现全场景、全天候、无盲区的精细化环境理解。

getusushu的博客 293

国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)

国科大学习资料–人工智能原理与算法-2020年期末考试题解析 张文生老师主讲 试卷共有6道题,题目不难,希望大家能取得好的成绩。 3.9 传教士和野人问题。三个传教士和三个野人在河的一岸,有一条能载一个人或者两个人的船。请设法使所有人都渡到河的另一岸,要求在任何地方野人数都不能多于传教士的人数。这个问题在AI领域中很有名,是因为它是第一个从分析的观点探讨问题形式化的论文的主题(Amarel,1968)。 a. 请对该问题进行详细形式化,只描述确保该问题求解所必需的特性。画出完整的状态空间图。 b. 应用合适

无名何许人的博客 4789

java中使用savepoint_事务中savepoint(保存点)的使用

savepoint概念:首先要知道savepoint就是为回退做的,savepoint的个数没有限制,savepoint和虚拟机中快照类似. savepoint是事务中的一点。用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点。回退事务的几个重要操作1.设置保存点 savepoint a2.取消保存点a之后事务 rol...

weixin_39517859的博客 1371

MATLAB 与 STK 互联导出导弹轨迹及速度数据(csv导出)

本文介绍了如何通过 MATLAB 脚本连接 STK 提取导弹三维轨迹数据,并以 CSV 格式导出,包含以下关键内容:自动连接 STK 场景;获取所有导弹对象;提取 J2000 坐标系下的位置和速度;加入任务优先级与状态;导出为标准 CSV 文件;

weixin_52370774的博客 781

JVM 内存分配与垃圾回收策略

本文探讨JVM内存分配与垃圾回收策略,涵盖Eden区对象分配、大对象直接进入老年代、长存对象晋升、动态年龄判定及空间分配保证,还涉及堆结构、垃圾回收算法、JVM调优及应用实践,力求全面且易懂。

持续输出Java相关知识 796

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

分配策略_一文搞懂JVM垃圾回收和内存分配策略

JVM垃圾回收器和内存分配策略前言:程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生命「线程私有」,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,只有在程序处于运行期才知道那些对象会创建,这部分内存的分配和回收都是动态的,垃圾回收期所关注的就是这部分...

weixin_29091837的博客 239

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JVM垃圾回收以及内存分配策略

JVM垃圾回收以及内存分配策略 文章目录JVM垃圾回收以及内存分配策略计算对象存活的算法引用计数算法(Reference Counting)根搜索算法(GC Rooting Tracing)引用类型强引用(Strong Reference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(Phanton Reference)对象的死亡与逃生永久代(方法区)的垃圾回收垃圾回收算法标记-清除(Mark-Sweep)复制(Copy)标记-整理(Mark-Compact)分代收集(

foolishboy_w的博客 293

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入理解 JVM 之——垃圾回收与内存分配策略

更好的阅读体验。

LYS00Q的博客 774

JVM简介—垃圾回收器和内存分配策略

给对象添加一个引用计数器,每当一个地方引用它时就将计数器加1,当引用失效时就将计数器减1,任何时刻计数器为0的对象都不再被使用。这种算法简单,但是有个致命的缺点,就是不能用于相互引用的情况。优点:快、方便、实现简单缺点:对象相互引用时,很难判断对象是否应被回收PHP、Python的垃圾回收就是使用了引用计数算法,Java的垃圾回收使用的是可达性分析。//testGC()执行后, objA和objB会不会被GC呢?//这个成员属性的唯一意义就是占点内存, 以便能在GC日志中看清楚是否有回收过。

dsgdauigfs的博客 1308

JVM垃圾回收算法和内存分配策略

记录JVM学习过程,参考: 周志明的《深入了解Java虚拟机》垃圾回收算法引用计数器算法(HotSpot中未使用)比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。1. 停止-复制(stop-and-copy):适用于对象存活率低时用,新生代使用先暂停程序的运行(所以它不属于后台回收

REI的专栏 401

JVM学习(二)垃圾回收器和内存分配策略

博客中相关代码的git 地址: JVM学习(一)自动内存管理机制 地址:https://blog.youkuaiyun.com/qq_40119805/article/details/107399842 JVM学习(二)垃圾回收器和内存分配策略 地址:https://blog.youkuaiyun.com/qq_40119805/article/details/107432575 JVM学习(三)虚拟机执行子系统 地址:https://blog.youkuaiyun.com/qq_40119805/article/deta

qq_40119805的博客 256

JVM的垃圾回收算法、垃圾收集器和内存分配策略

JVM的垃圾回收算法、垃圾收集器和内存分配策略怎样判断对象是否可回收1、引用计数法2、可达性分析法引用的4种类型Java对象如何被回收回收方法区垃圾回收算法垃圾收集器内存分配和回收策略 怎样判断对象是否可回收 1、引用计数法 给对象添加一个引用计数器,每当一个地方引用,计数器加1;每当引用失效时,计数器的值就减1;当计数器为0时的对象就不可能被使用的。 当两个对象相互引用时,会导致无法回收这两个...

某某灬 246

垃圾回收器及内存分配策略 - JVM - b

垃圾回收器及内存分配策略 - JVM - b 1.垃圾回收器 1.1 Serial收集器 图示: 特征: 一个CPU或线程完成任务 收集时暂停其它所有线程 优: 简单高效 应有: Client Serial/Serial Old图示 1.2 ParNew收集器 Serial多线程版本 能与CMS收集器合作 应用: server模式 ParNew + S...

wyc的博客 660

Java虚拟机垃圾回收(四) 总结: 内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法       在《Java对象在Java虚拟机中的创建过程》了解到对象创建的内存分配,在《Java内存区域 JVM运行时数据区》中了解到各数据区有些...

尚拙的博客 190

JVM的内存分配策略对垃圾回收有什么影响?

JVM的内存分配策略通过控制对象在新生代/老年代的分布、存活周期和内存占用模式,直接影响GC的触发条件、回收成本和内存碎片。合理的分配策略(如根据对象生命周期调整晋升阈值、优化大对象处理方式)能显著减少GC压力,降低停顿时间,提升系统稳定性。反之,不合理的分配策略可能导致GC频繁、效率低下,甚至引发内存溢出(OOM)。因此,在实际优化中,需要结合应用的对象创建特点(如对象大小、生命周期)调整内存分配参数,同时匹配合适的垃圾收集器,才能实现内存管理的最优性能。

2509_93306611的博客 300

JVM垃圾回收器、内存分配与回收策略

一般的垃圾回收器是在尽量短的时间内进行垃圾回收,这样程序与用户交互的时间间隔比较小,不会出现长时间的卡顿现象。G1取消了堆内结构的新生代、老年代的物理空间划分,将整个Java堆划分为大小固定的独立区域,后台维护一个优先列表来跟踪这些区域的垃圾堆积程度,每次根据允许收集的时间,优先回收垃圾最多的区域。parNew收集器即并行收集器,采用的是多线程方式进行垃圾回收,可以理解为Serial收集器的多线程版本,吞吐量要比串行高很多,是服务器级别的虚拟机默认使用的,用来处理新生代的垃圾回收器。

智海观潮的博客 642

JVM(02):垃圾回收和内存分配策略

一、内存分配与回收策略 对象的内存分配,可以理解为在堆内存上分配内存空间,有时候也会经过JIT编译后被拆散成标量类型,分配在栈内存中。这里主要介绍堆内存的分配。 对象一般会被分配在新生代的Eden区,有些对象也会被直接分配在老年代,这主要看相关细节设置。 1、对象优先被分配在Eden区 对象首先会被在Eden区进行内存分配,如果Eden区空间不足,则会进行一次Minor GC,然后将剩下的对象转移到Survivor区,如果Survivor区的空间不能够放下Eden区进过GC后...

码农六子 521
上一篇: Java对象在内存中存储结构
下一篇: JVM-类的加载机制
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值