JVM的垃圾回收

JVM-垃圾回收 垃圾回收及其算法 阅读详情

一、GC(Garbage Collection)

Java/.NET 中的垃圾收集器。Java 是由 C++ 发展来的。它摈弃了 C++ 中一些繁琐容易出错的东西,其中有一条就是 GC。

C/C++ 定义一个变量,就在内存中开辟一段相应的空间来存值。由于内存有限的,当程序不再需要使用该变量时,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。C/C++ 释放无用变量内存空间的事情需要由程序员来处理,就是说当程序员认为变量没用了,就手动释放其占用的内存。但是这样非常繁琐,如果有所遗漏,就可能造成资源浪费甚至内存泄露。当软件系统比较复杂,变量多的时候程序员往往就忘记释放内存或者在不该释放的时候释放内存了。

有了 GC,程序员就不再需要手动控制内存的释放。当 JVM 或 .NET CLR 发觉内存资源紧张的时候,就会自动清理无用对象(没有被引用到的对象)所占用的内存空间(这里的说法略显粗略,事实上何时清理内存是个复杂的策略)。如果需要,可以在程序中显式地调用System.gc()来强制立即进行一次内存清理。Java 提供的 GC 功能可以自动监测对象是否超过了作用域,从而达到自动回收内存的目的,Java 的 GC 会自动进行管理,调用方法:System.gc()或者Runtime.getRuntime().gc()。

二、堆内存划分及GC类型

1️⃣堆内存根据对象存活的生命周期被划分为两块,一块是新生代(Young Generation),另一块是老年代(Tenured Generation),大概比例是:新生代:老年代 == 1:2。新生代又分为 Eden 和 Survivor,二者空间大小比例默认为Eden:Survivor == 8:2。幸存区又分为S0和S1,二者空间大小是一模一样的。在堆区之外还有一个元空间(MetaSpace)。JDK8 HotSpot 移除了永久代(Permanet Generation),使用MetaSpace来代替,其是使用本地内存来存储类元数据信息。内存容量取决于操作系统虚拟内存大小,通过参数 -MaxMetaspaceSize 来限制其大小。

2️⃣GC类型

  1. 部分收集(Partial GC):指收集的目标不是整个 Java 堆的垃圾收集。其中又分为:

①新生代收集(Minor GC/Young GC):【一般采用复制-回收算法】
指目标只是新生代的垃圾收集,主要是由于 Eden 不够分配了。这个区,大多数 Java 对象都是朝生夕灭,所以 Minor GC 是非常频繁的,回收速度也比较快。

②老年代收集(Major GC/Old GC):【标记-清除算法】
指目标只是老年代的垃圾收集。目前只有 CMS 收集器会有单独收集老年代的行为。另外请注意“Major GC”这个说法现在有点混淆,在不同资料上常有不同所指, 读者需按上下文区分到底是指老年代的收集还是整堆收集。

③混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有 G1 收集器会有这种行为。

  1. 整堆收集(Full GC):收集整个 Java 堆和方法区的垃圾收集。

因为 Full GC 要对整个堆进行回收,包括 Young、Tenured 和 MetaqSpace。所以比 Partial GC 要慢,因此应该尽可能减少 Full GC 的次数。在对JVM调优的过程中,很大一部分工作就是对于 Full GC 的调节。

3️⃣“对象进入到老年代”的四种情况

  1. Minor GC/Young GC 时,To Survivor 区不足以存放存活的对象,对象会直接进入到老年代。
  2. 经过多次 Minor GC/Young GC 后,如果存活对象的年龄达到了设定阈值,则会晋升到老年代中。
  3. 动态年龄判定规则,To Survivor 区中相同年龄的对象,如果其大小之和占到了 To Survivor 区一半以上的空间,那么大于此年龄的对象会直接进入老年代,而不需要达到默认的分代年龄。
  4. 大对象:由-XX:PretenureSizeThreshold启动参数控制,若对象大小大于此值,就会绕过新生代,直接在老年代中分配。HotSpot 虚拟机提供该参数,指定大于其值的对象直接在老年代分配的意义在于,避免大对象在 Eden 区及两个 Survivor 区之间来回复制,产生大量的内存复制操作。

三、堆内存垃圾回收过程

在新生代中,由于对象生存期短,每次垃圾回收时都有大量的对象需要被回收,这时采用复制算法。老年代里的对象存活率较高,每次垃圾回收时只有少量对象需要被回收,没有额外的空间进行分配担保,这时采用标记-整理或者标记-清除算法。可以根据不同代的特点采取最适合的收集算法。
分代收集算法

1️⃣Minor GC/Young GC 的回收过程

  1. 通常,对象直接在新生代中的 Eden 区进行分配,如果 Eden 区没有足够的空间,那么就会触发 Minor GC,处理的区域只有新生代。因为大部分对象在短时间内都可以回收掉,因此 Minor GC/Young GC 后只有极少数的对象能存活下来,而被移动到S0区(采用的是复制算法),并且对象的年龄设为 1。

  2. 当触发下一次 Minor GC/Young GC 时,会将 Eden 区和S0区的存活对象移动到S1区,同时清空 Eden 区和S0区。当再次触发 Minor GC/Young GC 时,此时处理的区域就变成了 Eden 区和S1区(即S0和S1进行角色交换)。如此反复,对象在 Survivor 区中每“熬过”一次 Minor GC/Young GC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁),就将会被晋升到老年代中。对象晋升老年代的阈值,可以通过参数-XX:MaxTenuringThreshold 设置。

2️⃣Full GC 的触发时机

当晋升到老年代的对象大于了老年代的剩余空间时,就会触发 Full GC。除此之外,还有以下四种情况也会触发:

  1. 老年代的内存使用率达到了一定阈值(可通过参数调整),直接触发 Full GC。

  2. 空间分配担保
    在发生 Minor GC/Young GC 之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间。

①如果大于,那这一次 Minor GC/Young GC 可以确保是安全的。
②如果小于,则虚拟机会先查看- XX:HandlePromotionFailure的设置值是否允许担保失败(Handle Promotion Failure):

  • 如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行 Minor GC/Young GC,尽管此次 Minor GC/Young GC 有风险。
  • 如果小于,或者-XX: HandlePromotionFailure设置不允许冒险,那这时就要改为进行一次 Full GC。
  1. Metaspace 达到-XX:MetaspaceSize【元空间初始值,以字节为单位】的指定值时,也会触发 Full GC。同时收集器会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过-XX:MaxMetaspaceSize【元空间最大值,默认是-1,即不限制,或者说只受限于本地内存大小。】(如果设置了)的情况下,适当提高该值。

  2. System.gc()或者Runtime.getRuntime().gc()被显式调用时,触发 Full GC。

四、GC只回收堆内存和方法区内的对象

JVM 内存区域中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生、随线程而灭。因此这三个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而 Java 堆区和方法区则不一样,这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分。

垃圾收集器在对堆区和方法区进行回收前,首先要确定这些区域的对象哪些可以被回收,哪些暂时还不能回收,这就要用到判断对象是否存活的算法:
①引用计数算法
②可达性分析算法
③对象死亡(被回收)前的最后一次挣扎
④方法区如何判断是否需要回收

1️⃣引用计数算法

引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象实例都有一个引用计数。当一个对象被创建时,就将该对象实例分配给一个变量,该变量计数设置为 1。当任何其它变量被赋值为这个对象的引用时,计数 +1(a = b,则 b 引用的对象实例的计数器 +1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器 -1。任何引用计数器为 0 的对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器 -1。

优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。
缺点:无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,它们的引用计数永远不可能为 0。

public class ReferenceFindTest {
  public static void main(String[] args) {
     MyObject object1 = new MyObject();
     MyObject object2 = new MyObject();

     object1.object = object2;
     object2.object = object1;

     object1 = null;
     object2 = null;
  }
}

这段代码是用来验证引用计数算法不能检测出循环引用。最后两句将 object1 和 object2 赋值为 null,也就是说 object1 和 object2 指向的对象已经不可能再被访问,但是由于它们互相引用对方,导致它们的引用计数器都不为 0,那么垃圾收集器就永远不会回收它们。

2️⃣可达性分析算法

可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,从一个节点 GC ROOT 开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,无用的节点将会被判定为可回收的对象。引用节点图论

Java 可作为 GC Roots 的对象包括下面几种:
①虚拟机栈中引用的对象(栈帧中的本地变量表);
②方法区中类静态属性引用的对象;
③方法区中常量引用的对象;
④本地方法栈中 JNI(Native方法) 引用的对象。

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。在 Java 中,将引用又分为强引用、软引用、弱引用、虚引用四种,这四种引用强度依次逐渐减弱。引用计数算法和可达性分析算法都是基于强引用而言的。

3️⃣对象死亡(被回收)前的最后一次挣扎

即使在可达性分析算法中不可达的对象,也并非是“非死不可”,此时它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程。

第①次标记:如果对象在进行可达性分析后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记;
第②次标记:第一次标记后接着会进行一次筛选,筛选的条件是此对象是否有必要执行 finalize()。在 finalize() 中没有重新与引用链建立关联关系的,将被进行第二次标记。

第二次标记成功的对象将真的会被回收,如果对象在 finalize() 中重新与引用链建立了关联关系,那么将会逃离本次回收,继续存活。

4️⃣方法区如何判断是否需要回收

方法区存储内容是否需要回收的判断不同于上。方法区主要回收的内容有:废弃常量和无用的类。对于废弃常量也可通过引用的可达性来判断,但是对于无用的类则需要同时满足下面三个条件:
①该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例;
②加载该类的ClassLoader已经被回收;
③该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

五、常用的垃圾收集算法

1️⃣标记-清除算法

采用从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如图。标记-清除算法不需要进行对象的移动,只需对不存活的对象进行处理,在存活对象比较多的情况下相对高效。但是会有两个主要问题:①效率不高,标记和清除的效率都很低;②会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次 GC 动作。
标记-清除算法

2️⃣复制算法【参见第三项】

复制算法的提出是为了克服句柄的开销和解决内存碎片的问题。它开始时把堆分成一个对象面和多个空闲面,程序从对象面为对象分配空间,当对象满了,基于复制算法的垃圾收集就从根集合(GC Roots)中扫描还活动的对象,并将每个活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。然后一次性清除完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,内存的代价太高,每次基本上都要浪费一半的内存。改进该算法后,新生代内存区域不再按照 1:1 去划分,而是被划分为 8:1:1 三部分,较大那份内存叫 Eden 区,其余是两块较小的内存区叫 Survior 区。每次都会优先使用 Eden 区,若 Eden 区满,就将对象复制到第二块内存区上,然后清除 Eden 区,如果此时存活的对象太多,以至于 Survivor 不够时,会将这些对象通过分配担保机制复制到老年代中。复制算法

3️⃣标记-整理算法

采用标记-清除算法一样的方式进行标记,但在清除时不同,在回收不存活对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法在标记-清除算法的基础上,进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题。当对象存活率较高时,也解决了复制算法的效率问题。具体流程如图:标记-整理算法

六、垃圾收集器

如图是 HotSpot 虚拟机包含的所有收集器:

新生代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
新生代和老年代的收集器之间进行连线,说明它们之间可以搭配使用。

七、新生代垃圾收集器

1️⃣Serial—串行收集器【单线程、复制算法】最基本的、发展历史最悠久的收集器
特点:
串行收集器是指使用单线程进行垃圾回收的收集器。每次回收时,串行收集器只有一个工作线程,暂停其他线程。对于并行能力较弱的单 CPU 计算机来说,串行收集器的专注性和独占性往往有更好的性能表现。它存在 Stop The World 问题,即垃圾回收时,要停止程序的运行。使用-XX:+UseSerialGC参数可以设置新生代使用这个串行收集器。

2️⃣默认ParNew—并行收集器【多线程、复制算法】
ParNew 其实就是 Serial 的多线程版本,除了使用多线程之外,其余参数和 Serial 一模一样。
特点:
ParNew 默认开启的线程数与 CPU 数量相同,在 CPU 核数很多的机器上,可以通过参数-XX:ParallelGCThreads来设置线程数。它是目前新生代首选的垃圾收集器,因为除了 Serial 之外,只有它能与老年代 CMS 配合工作的。它同样存在 Stop The World 问题。使用-XX:+UseParNewGC参数可以设置新生代使用这个并行收集器。

3️⃣Parallel Scavenge【多线程、复制算法】
特点:
就是非常关注系统的吞吐量,吞吐量=代码运行时间/(代码运行时间+垃圾收集时间)

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间,可用把虚拟机在GC停顿的时间控制在 MaxGCPauseMillis 范围内,如果希望减少 GC 停顿时间可以将 MaxGCPauseMillis 设置的很小,但是会导致 GC 频繁,从而增加了 GC 的总时间,降低了吞吐量。所以需要根据实际情况设置该值。

-Xx:GCTimeRatio:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99,那么系统将花费不超过1/(1+n)的时间用于垃圾回收,也就是1/(1+99)=1%的时间。

另外还可以指定-XX:+UseAdaptiveSizePolicy打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

使用-XX:+UseParallelGC参数可以设置新生代使用这个并行收集器。

八、老年代垃圾收集器

1️⃣SerialOld—串行收集器【单线程、标记 - 整理算法】
SerialOld 是 Serial 收集器的老年代收集器版本。

用途:
一个是在JDK1.5及之前的版本中与 Parallel Scavenge 收集器搭配使用。另一个就是作为 CMS 收集器的后备预案,如果 CMS 出现 Concurrent Mode Failure,则 SerialOld 将作为后备收集器。

2️⃣Parallel Old—并行收集器【多线程、标记压缩算法】
它和新生代的 Parallel Scavenge 收集器一样,也是一种关注吞吐量的收集器。使用-XX:+UseParallelOldGc设置老年代使用该收集器。使用-XX:+ParallelGCThreads设置垃圾收集时的线程数量。

3️⃣CMS【标记清除法】
CMSConcurrent Mark Sweep意为并发标记清除主要关注系统停顿时间。使用-XX:+UseConcMarkSweepGC设置老年代使用该收集器。使用-XX:ConcGCThreads设置垃圾收集时的线程数量。

特点:
CMS 并不是独占的收集器,也就说 CMS 回收的过程中,应用程序仍然在工作,又会有新的垃圾产生,所以在使用 CMS 的过程中应该确保应用程序的内存足够可用。如果老年代剩余空间无法存放需要分配的对象,会产生concurrent-mode-failure。

CMS 不会等到应用程序饱和时才去回收垃圾,而是在某一阈值时开始回收,回收阈值可用-XX:CMSInitiatingoccupancyFraction进行配置,默认为 68,也就是说当老年代的空间使用率达到68%的时候,会执行 CMS 回收。

如果内存使用率增长的很快,在 CMS 执行的过程中,出现了内存不足的情况,此时 CMS 回收就会失败,虚拟机将启动 SerialOld GC 进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。这个过程 GC 的停顿时间可能较长,所以-XX:CMSInitiatingoccupancyFraction的设置要根据实际的情况。

标记清除法有个缺点就是存在内存碎片的问题。CMS 设置-XX:+UseCMSCompactAtFullCollecion可以使其回收完成之后进行一次碎片整理。使用-XX:CMSFullGCsBeforeCompaction设置进行多少次 CMS 回收之后,对内存进行一次压缩。

九、堆内存常见参数配置

十、TLAB 内存

TLAB 全称是 Thread Local Allocation Buffer 即线程本地分配缓存,从名字上看是一个线程专用的内存分配区域,是为了加速对象分配而生的。每一个线程都会产生一个 TLAB,该线程独享的工作区域,JVM 使用这种 TLAB 区来避免多线程冲突问题,提高了对象分配的效率。TLAB 空间一般不会太大,当大对象无法在 TLAB 分配时,则会直接分配到堆上。

【JVM】总结篇之垃圾回收★ 内存溢出OOM内存泄漏(Memory Leak)严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”。内存泄露的情况:1.静态集合2.单例模式3.非静态内部类持有外部类4.各种连接,如数据库连接、网络连接和IO连接等5.变量不合理的作用域一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。 阅读详情

相关推荐

Synopsys 逻辑综合之 ICG

文章摘要: ICG(集成时钟门控单元)是一种用于降低时钟功耗的专用逻辑单元,通过控制时钟信号的传播实现节能。其核心原理是在寄存器前插入门控逻辑(如gclk=clk&en),但需避免直接使用AND门以防止毛刺,转而采用带锁存器的专用ICG单元。在RTL设计中,符合条件(如稳定使能信号)的if(en)结构可被综合工具(如DesignCompiler)自动识别并替换为ICG。使用时需配置时序检查(如PrimeTime分析使能路径、门控时钟延迟),并注意避免组合逻辑使能、多级门控等误区。ICG是芯片低功耗设

Serven的博客 4346

JVM 垃圾回收机制深度解析(含图解)

JVM 垃圾回收机制的系统化梳理,涵盖对象判定、回收算法、垃圾收集器及选型策略。 JVM 垃圾回收机制的进一步细化,结合图解直观展示核心概念、算法流程及收集器工作原理

初入江湖,多多关照 3261

RK3588 InsightFace人脸识别移植及精度测试全解析

本文详细介绍了如何在RK3588平台上移植InsightFace人脸识别模型并进行精度验证。通过PyTorch转ONNX、ONNX转RKNN量化模型的关键步骤,实现了INT8量化模型的部署。测试数据显示,该模型在LFW数据集上达到99.43%的准确率(接近官方99.52%),推理时间仅14.23ms。ROC曲线和相似度分布图表明模型区分能力优秀,AUC超过0.99,满足实际应用需求。文中还详解了量化原理、环境搭建和测试方法,为边缘设备部署人脸识别提供了完整解决方案。

Hi20240217的博客 3661

java 强制回收内存_使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存...

一、问题背景自己开发的Java项目中占用太多的HeapSpace。即使在Eclipse的虚拟机参数中设置“-Xms128m -Xms2048m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m”之后,仍超出Heap空间。决定用Jprofiler分析问题原因。二、解决过程Jprofier分析过程中,发现下面的char[]和java.lang.Str...

weixin_33626238的博客 488

MounRiver Studio实战:像管理个人项目一样整理沁恒MCU的EVT例程(附文件结构图)

本文详细介绍了如何使用MounRiver Studio重构沁恒MCU的EVT例程,实现工程化管理。通过分析官方EVT设计的局限性,提出标准化的目录结构和迁移步骤,帮助开发者提升代码可维护性和团队协作效率。文章还提供了MounRiver Studio的关键配置参数和常见问题排查指南,适用于沁恒MCU开发者。

weixin_33940469的博客 356

【Py/Java/C++/C/JS/Go六种语言OD独家2024E卷真题】20天拿下华为OD笔试之【固定滑窗】2024E-考勤信息【欧弟算法】全网注释最详细分类最全的华为OD真题题解

可上练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【优快云】否则不通过)

weixin_48157259的博客 617

Java--垃圾回收机制(过程)

当 Java 程序运行时,对象会被动态地分配在堆内存中。随着程序的运行,有些对象可能不再被引用,成为垃圾。垃圾回收是指在程序运行时,对这些垃圾对象进行清理,以便腾出内存空间供新的对象使用。垃圾回收分为三步,如下图所示。

qq_64183220的博客 1322

【WRF湿度调整策略】WRF/ERA5湿度数据对比

【WRF湿度调整策略】WRF/ERA5湿度数据对比

WW、forever的博客 117

JVM垃圾回收

垃圾回收,回收算法,垃圾回收器,cms,serial new,serial old,parallel,GC日志

weixin_38612401的博客 4507

华南理工大学-大学物理实验-绪论作业

3.用公式测量某圆柱体铝的密度,测得直径=2.0420.003(cm),高=4.1260.004(cm),质量=36.4880.006(g)。计算铝的密度和测量的标准差,并以测量结果表达式表示之。(要求判别和剔除异常数据)(30分)(了解图解法的注意事项,大学物理实验众多实验数据处理采用这种方法,如PN结温度特性研究,光电效应与普朗克常数的测定,霍尔效应测磁场等等,注意规范作图)实验测得温度与对应的金属丝的长度的数据如下表所示。(了解异常数据的判断方法及具体判断过程,30分的题目n(*≧▽≦*)n)

mohen_777的博客 580

beegfs读取文件完整流程分析

读取小于512KB文件数据,小于1s 读取15MB文件数据,花费7秒。

wfzy的博客 833

JVM-垃圾回收机制

垃圾回收算法 到 垃圾回收器垃圾回收概念1、什么是垃圾2、为什么需要GC3、早期垃圾回收4、Java垃圾回收机制垃圾回收相关算法1、标记阶段:引用计数算法2、标记阶段:可达性分析算法3、对象的finalization机制4、清除阶段:标记-清除算法5、清除阶段:复制算法6、清除阶段:标记-压缩算法7、小结8、分代收集算法9、增量收集算法、分区算法垃圾回收相关概念垃圾回收器 垃圾回收概念 1、什么是垃圾 什么是垃圾(Garbage)呢? 垃圾是指在 运行程序中没有任何指针指向的对象, 这个对象就是需要被回收的

qq_45464560的博客 1万+

【SigmaStudio】自定义算法组件之XML编写规范(一)

SigmaStudio生成自定义算法组件时,需要XML和DLB文件,本文主要记录XML文件的编码规范

liang_song的博客 1139

JVM中垃圾回收

JVM中的垃圾回收是通过对堆内存进行管理、清理无用对象,从而确保应用的高效运行。整个垃圾回收过程包括对象的分代存储、不同的垃圾回收算法(标记-清除、复制、标记-整理等),以及多种垃圾回收器(Serial GC、Parallel GC、CMS GC、G1 GC等)来适应不同的应用场景。优化垃圾回收是一个综合的过程,需要根据应用的特性选择合适的垃圾回收器,并通过合理的内存分配、减少对象创建与销毁、调优对象晋升策略等方法减少GC对应用性能的影响。

yymagicer的博客 2261

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】

????‍????博主主页:爪哇贡尘拾Miraitow ????传作时间:????2022年1月9日 晚21:44???????? ????内容介绍:最近在学习JVM所以会时不时更新有关内容 ????参考资料:黑马JVM 度娘 ????参考链接:????JVM垃圾回收机制 ⏳简言以励:列位看官,且将新火试新茶,诗酒趁年华 ????内容较多有问题希望能够不吝赐教???? ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ????JVM垃圾回收 ♻1.1 如何判断对象可以回收♻1、 引用计数器法2、可达

qq_46489085的博客 4063

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

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

JVM——垃圾回收

本文详细介绍了Java垃圾回收机制的核心概念和实现方法。首先,文章解释了如何判断对象可以回收,包括引用计数法和可达性分析算法,并介绍了四种引用类型:强引用、软引用、弱引用和虚引用。接着,文章探讨了三种垃圾回收算法:标记清除、标记整理和标记复制,并分析了它们的优缺点。随后,文章介绍了分代垃圾回收机制,将堆内存划分为新生代和老年代,并详细描述了MinorGC的流程。此外,文章还介绍了六种常见的垃圾回收器,包括串行、并行和并发的垃圾回收器,并重点分析了CMS和G1垃圾回收器的工作原理和优缺点。最后,文章提供了垃圾

2301_81283571的博客 1668

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【JVM系列详解】jvm垃圾回收机制(中)——垃圾回收算法

垃圾回收是JVM中十分重要的内容,也是面试常考察的点。 本文为垃圾回收系列的中篇,将详细介绍垃圾回收算法。其中重点在于分代垃圾回收算法。

m0_51214238的博客 2228

jvm垃圾回收

垃圾回收是指JVM自动释放不再被程序使用的内存对象,避免内存泄漏和溢出问题。自动管理内存分配和释放。保证程序稳定运行。提高内存使用效率。JVM垃圾回收机制通过自动化内存管理,极大地简化了开发人员的工作,同时提高了应用程序的性能和稳定性。理解垃圾回收的原理和算法,可以帮助我们优化程序内存使用并解决运行时内存问题。JVM通过引用计数法和可达性分析法判定垃圾对象。垃圾回收算法包括标记-清除、复制、标记-整理和分代收集。不同垃圾回收器适用于不同的场景,应根据应用需求选择合适的GC策略。

Flying_Fish_roe的博客 1235

一文看懂:JVM垃圾回收算法、CMS垃圾回收器、G1垃圾回收器

Hello,大家好,我是此林。今天我们来聊一聊 JVM 垃圾回收机制。在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。手动回收的方式相对来说回收比较及时,删除代码执行之后对象就被回收了,可以快速释放内存。缺点是对程序员要求比较高,很容易出现创建完对象之后,程序员忘记释放对象。

2401_82540083的博客 2512

JVM垃圾回收器

例如,在处理大量并发请求时,我们可以采用多线程或多进程的方式,将请求分发到不同的处理单元上,以提高系统的吞吐量和响应速度。例如,在G1回收器中,JVM会根据应用的实际运行情况,动态地调整各代的比例和垃圾回收的时机,以达到全局最优的效果。:Parallel回收器是Serial回收器的多线程版本,它利用多核CPU的优势,提高了垃圾回收的效率。JVM的垃圾回收器从最初的Serial回收器,发展到Parallel回收器、CMS回收器和G1回收器,经历了从单线程到并发与并行的转变。此外,我们还可以通过设置如。

guangzhi0633的专栏 1443

【JVM】垃圾回收

文章目录JVM-垃圾回收1.如何判断对象可以回收1-1 引用计数法1-2 可达性分析算法1-3 五种引用2.垃圾回收算法2-1 标记清除2-2 标记整理2-3 复制3.分代垃圾回收3-1 回收流程3-2 GC 分析4.垃圾回收器4-1 串行4-2 吞吐量优先4-3 响应时间优先4-4 G15.垃圾回收调优5-1 调优领域5-2 确定目标5-3 最快的 GC5-4 新生代调优5-5 老年代调优 JVM-垃圾回收 本文章参考:黑马程序员JVM 1.如何判断对象可以回收 1-1 引用计数法 当一个对象被其他变量

小皮皮LL的博客 4089

JVM学习《垃圾回收算法和垃圾回收器》

因此就出现了一种标记-整理算法(Mark-Compact)算法,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录(主要 是处理漏标问题),这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。

GQ_666的博客 1630
上一篇: JVM 的类加载原理
下一篇: Java 内存模型(Java Memory Model)
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值