说一下 jvm 有哪些垃圾回收器?

【JVM学习】垃圾回收器 文章目录一、GC分类与性能指标1.1 垃圾收集器分类(1)按线程数分(2)按工作模式分(3)其他分类1.2 性能指标(1)性能指标:吞吐量(2)性能指标:暂停时间(3)吞吐量vs暂停时间二、不同的垃圾回收器概述2.1 垃圾回收器发展史2.2 7种经典的垃圾收集器2.3 垃圾收集器的组合关系三、Serial回收器:串行回收四、ParNew回收器:并行回收五、Parallel回收器:吞吐量优先六、CMS回收器:低延迟6.1 概述6.2 优缺点分析6.3 设置参数七、G1回收器:区域化分代式7.1 概述7.2 优 阅读详情
AI摘要

本文详细介绍了JVM中的各种垃圾回收器,包括串行、并行、CMS和G1回收器的特点、适用场景及工作原理。重点解析了G1回收器的分区概念、收集过程及其优势。

一、串行垃圾回收器

在JDK1.3之前,单线程回收器是唯一的选择。它的单线程意义不仅仅是说它只会使用一个CPU或一个手机线程去完成垃圾收集工作。而且它进行垃圾回收的时候,必须暂停其它所有的工作线程(Stop The World,STW),直到它收集完成。它适合Client模式的应用,在单CPU环境下,它效率高效,由于没有线程交互的开销,专心垃圾收集自然可以获得最高的单线程效率。

串行的垃圾收集器有两种,Serial和Serial Old,一般两者搭配使用。

新生代采用Serial,是利用复制算法;老年代使用Serial Old采用标记-整理算法。Client应用或者命令行程序可以通过

-XX:+UseSerialGC开启串行垃圾回收器。

二、并行垃圾回收器

并行垃圾回收器是通过多线程进行垃圾收集的。也会暂停其它所有的工作线程(Stop The World,STW)。适合Server模式以及多CPU环境。一般会和JDK1.5之后出现的CMS搭配使用。并行的垃圾回收器有以下几种:

ParNew:Serial收集器的多线程版本,默认开启的收集线程数和CPU数量一样,运行数量可以通过修改ParallelGCThreads设定。用于新生代手机,复制算法。用-XX:+UseParNewGC,和Serial Old收集器组合进行内存回收。

 Parallel Scavenge: 关注吞吐量,吞吐量优先,吞吐量=代码运行时间/(代码运行时间+垃圾收集时间),也就是高效率利用CPU时间,尽快完成程序的运算任务可以升值最大停顿时间MaxGCPauseMillis以及,吞吐量大小GCTimeRatio。如果设置了-XX:+UseAdaptiveSizePolicy参数,则随着GC,会动态调整新生代的大小,Eden,Survivor比例等,以提供最合适的停顿时间或者最大的吞吐量。用于新生代收集,复制算法。通过-XX:+UseParallelGC参数,Server模式下默认提供了其和SerialOld进行搭配的分代收集方式。

Parllel Old:Parallel Scavenge的老年代版本。JDK 1.6开始提供的。在此之前Parallel Scavenge的地位也很尴尬,而有了Parllel Old之后,通过-XX:+UseParallelOldGC参数使用Parallel Scavenge + Parallel Old器组合进行内存回收。

三、CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获得最短回收停顿时间为目标的收集器。从名字就能知道它是标记-清除算法的。但是它比一般的标记-清除算法要复杂一些,分为以下4个阶段:

  1. 初始标记:标记一下GC Roots能直接关联到的对象,会"Stop The World"。
  2. 并发标记:GC Roots Tracing,可以和用户线程并发执行。
  3. 重新标记:标记期间产生的对象存活的再次判断,修正对这些对象的标记,执行时间相对并发标记短,会“Stop The World”。
  4. 并发清除:清除对象,可以和用户线程并发执行。

由于垃圾回收线程可以和用户线程同时运行,也就是说它是并发的,那么它会对CPU的资源非常敏感,CMS默认启动的回收线程数是(CPU数量+3)/ 4,当CPU<4个时,并发回收是垃圾收集线程就不会少于25%,而且随着CPU减少而增加,这样会影响用户线程的执行。而且由于它是基于标记-清除算法的,那么就无法避免空间碎片的产生。CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。

        所谓浮动垃圾,在CMS并发清理阶段用户线程还在运行着,伴随程序运行自然还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只能留待下一次GC时再清理掉。

四、G1垃圾收集器

1、G1垃圾收集器

把G1单独拿出来的原因是其比较复杂,在JDK 1.7确立是项目目标,在JDK 7u2版本之后发布,并在JDK 9中成为了默认的垃圾回收器。通过“-XX:+UseG1GC”启动参数即可指定使用G1 GC。

G1从整体看还是基于标记-清除算法的,但是局部上是基于复制算法的。这样就意味者它空间整合做的比较好,因为不会产生空间碎片。G1还是并发与并行的,它能够充分利用多CPU、多核的硬件环境来缩短“stop the world”的时间。G1还是分代收集的,但是G1不再像上文所述的垃圾收集器,需要分代配合不同的垃圾收集器,因为G1中的垃圾收集区域是“分区”(Region)的。G1的分代收集和以上垃圾收集器不同的就是除了有年轻代的ygc,全堆扫描的full GC外,还有包含所有年轻代以及部分老年代Region的Mixed GC。G1还可预测停顿,通过调整参数,制定垃圾收集的最大停顿时间。

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

2、G1分区的概念

G1的堆区在分代的基础上,引入分区的概念。G1将堆分成了若干Region,以下和”分区”代表同一概念。(这些分区不要求是连续的内存空间)Region的大小可以通过G1HeapRegionSize参数进行设置,其必须是2的幂,范围允许为1Mb到32Mb。 JVM的会基于堆内存的初始值和最大值的平均数计算分区的尺寸,平均的堆尺寸会分出约2000个Region。分区大小一旦设置,则启动之后不会再变化。如下图简单画了下G1分区模型。

Eden regions(年轻代-Eden区)

Survivor regions(年轻代-Survivor区)

Old regions(老年代)

Humongous regions(巨型对象区域)

Free regions(未分配区域,也会叫做可用分区)-上图中空白的区域

G1中的巨型对象是指,占用了Region容量的50%以上的一个对象。Humongous区,就专门用来存储巨型对象。如果一个H区装不下一个巨型对象,则会通过连续的若干H分区来存储。因为巨型对象的转移会影响GC效率,所以并发标记阶段发现巨型对象不再存活时,会将其直接回收。ygc也会在某些情况下对巨型对象进行回收。

分区可以有效利用内存空间,因为收集整体是使用“标记-整理”,Region之间基于“复制”算法,GC后会将存活对象复制到可用分区(未分配的分区),所以不会产生空间碎片。

3、G1 GC的分类和过程

JDK10 之前的G1中的GC只有Young GC,Mixed GC。Full GC处理会交给单线程的Serial Old垃圾收集器。

4、Young GC年轻代收集

在分配一般对象(非巨型对象)时,当所有Eden region使用达到最大阀值并且无法申请足够内存时,会触发一次Young GC。每次Young GC会回收所有Eden以及Survivor区,并且将存活对象复制到Old区以及另一部分的Survivor区。到Old区的标准就是在PLAB中得到的计算结果。因为Young GC会进行根扫描,所以会stop the world。

Young GC的回收过程如下:

1、根扫描,跟CMS类似,Stop the world,扫描GC Roots对象。

2、处理Dirty card,更新RSet.

3、扫描RSet,扫描RSet中所有old区对扫描到的young区或者survivor去的引用。

4、拷贝扫描出的存活的对象到survivor2/old区

5、处理引用队列,软引用,弱引用,虚引用

5、Mix GC混合收集

Mixed GC是G1 GC特有的,跟Full GC不同的是Mixed GC只回收部分老年代的Region。哪些old region能够放到CSet里面,有很多参数可以控制。比如G1HeapWastePercent参数,在一次young GC之后,可以允许的堆垃圾百占比,超过这个值就会触发mixed GC。

G1MixedGCLiveThresholdPercent参数控制的,old代分区中的存活对象比,达到阀值时,这个old分区会被放入CSet。

Mixed GC一般会发生在一次Young GC后面,为了提高效率,Mixed GC会复用Young GC的全局的根扫描结果,因为这个Stop the world过程是必须的,整体上来说缩短了暂停时间。

Mix GC的回收过程可以理解为Young GC后附加的全局concurrent marking,全局的并发标记主要用来处理old区(包含H区)的存活对象标记,过程如下:

1. 初始标记(Initial Mark)。标记GC Roots,会STW,一般会复用Young GC的暂停时间。如前文所述,初始标记会设置好所有分区的NTAMS值。

2. 根分区扫描(Root Region Scan)。这个阶段GC的线程可以和应用线程并发运行。其主要扫描初始标记以及之前Young GC对象转移到的Survivor分区,并标记Survivor区中引用的对象。所以此阶段的Survivor分区也叫根分区(Root Region)。

3. 并发标记(Concurrent Mark)。会并发标记所有非完全空闲的分区的存活对象,也即使用了SATB算法,标记各个分区。

4. 最终标记(Remark)。主要处理SATB缓冲区,以及并发标记阶段未标记到的漏网之鱼(存活对象),会STW,可以参考上文的SATB处理。

5. 清除阶段(Clean UP)。上述SATB也提到了,会进行bitmap的swap,以及PTAMS,NTAMS互换。整理堆分区,调整相应的RSet(比如如果其中记录的Card中的对象都被回收,则这个卡片的也会从RSet中移除),如果识别到了完全空的分区,则会清理这个分区的RSet。这个过程会STW。

清除阶段之后,还会对存活对象进行转移(复制算法),转移到其他可用分区,所以当前的分区就变成了新的可用分区。复制转移主要是为了解决分区内的碎片问题。

6、Full GC

G1在对象复制/转移失败或者没法分配足够内存(比如巨型对象没有足够的连续分区分配)时,会触发Full GC。Full GC使用的是stop the world的单线程的Serial Old模式,所以一旦触发Full GC则会STW应用线程,并且执行效率很慢。JDK 8版本的G1是不提供Full GC的处理的。对于G1 GC的优化,很大的目标就是没有Full GC。

 

前一篇:【JVM】HotSpot VM GC 的种类

后一篇:《深入理解Java虚拟机》第一章 走进Java,第二章 Java内存区域与内存溢出异常,第三章 垃圾收集器与内存分配策略

 

JVM系列之经典垃圾回收器(上篇) 垃圾回收器 阅读详情

相关推荐

VS2022错误列表高效处理:从复制到Excel表格的完整指南

本文详细介绍了在Visual Studio 2022中高效处理错误列表的实用技巧,重点讲解了如何将错误信息一键复制并粘贴到Excel表格中。通过基础操作、自定义视图、筛选功能及常见问题解决方案,帮助开发者将杂乱的编译错误整理成清晰、可排序、可筛选的数据表,极大提升了团队协作、错误分析和项目管理的效率。

weixin_28837817的博客 357

【JVM基础篇】Java垃圾回收器介绍

本文档详细解析了Java虚拟机(JVM)中垃圾回收器的原理与实践,涵盖Serial、ParNew、CMS、Parallel Scavenge与Parallel Old、G1等主流垃圾回收器的工作机制、优缺点及适用场景。特别聚焦于G1垃圾回收器,阐述其创新的Region分区管理、年轻代与混合回收策略,以及如何通过参数调整实现低延迟垃圾回收。适合希望深入了解JVM内存管理和优化的开发者阅读。

我只管埋头前行,剩下的交给时间。 5262

Unity事件总线第一篇:为什么你的游戏需要一个事件总线?

本文探讨了游戏开发中常见的跨模块调用导致代码强耦合的问题。通过一个攻击按钮触发角色攻击、怪物掉血和血条更新的案例,分析了直接调用方式带来的维护困难、扩展性差和模块重用性低等弊端。文章提出使用事件总线(Event Bus)作为解决方案,通过发布-订阅模式实现模块解耦。重构后的代码中,各模块只需与事件总线交互,彼此不再直接依赖。这种设计使得新增功能(如音效)无需修改现有代码,大大提高了系统的可维护性和扩展性,同时增强了模块的重用性,完美体现了开闭原则。

qq_46348216的博客 1297

JVM常见的垃圾回收器(详细)

STW是Stop-The-World缩写: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结丶应用程序停顿的⼀种状态。1、在STW 状态下,JAVA的所有线程都是停⽌执⾏的 -> GC线程除外2、一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。3、STW是不可避免的,垃圾回收算法执⾏一定会出现STW,我们要做的只是减少停顿的时间GC各种算法优化的重点,就是减少STW(暂停),同时这也是JVM调优的重点。

javaeEEse的博客 6623

Bellhop水声信道模型的仿真

Bellhop是一种基于射线追踪的水声信道模型,广泛用于预测水下环境中的声压场。它通过模拟声波在水中的传播路径,计算声场分布,适用于复杂的水下通信场景。

yt94832的博客 1305

rk3568 RGMII KSZ8795 MAC TO MAC

参考《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》

明天乌儿会歌唱 6489

JVM中的垃圾回收器

概述 如果说收集算法是内存回收的方法论,那么收集器就是内存回收的实践者。 垃圾收集器没有在Java虚拟机规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代的过程中,因此JAVA发展至今已经衍生了众多的GC版本。 从不同的角度来分析垃圾收集器,是可以将GC分为不同的类型。 垃圾回收器分类 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。 ......

古城的博客 1万+

手把手教你用IN-Sight智能相机实现双向TCP/IP通讯(附网络调试助手推荐)

本文详细解析了IN-Sight智能相机实现双向TCP/IP通讯的完整流程。通过将相机同时配置为TCP服务器和客户端,构建了与上位机(如PLC、MES)稳定可靠的数据交换通道。文章深入剖析了发送(TCPDevice)与接收(ReadDevice)通道的独立配置、关键参数设置(如结束符CR+LF)、高效调试工具选择以及实战避坑指南,帮助工程师快速掌握这一构建柔性产线数据节点的核心技术。

qsc9012345的博客 669

说一下 JVM 有哪些垃圾回收器?

Java虚拟机(JVM)提供了多种垃圾回收器(Garbage Collectors),用于自动管理内存,以释放不再使用的对象。请注意,这些垃圾回收器的选择通常取决于应用程序的需求和环境。不同的垃圾回收器有不同的性能和特性,因此选择最适合您应用程序的垃圾回收器是非常重要的。

qq_33240556的博客 984

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲到使用WidgetComponent和3DUI进行交互。然而,这种方法存在一个问题:为了让射线可视化,我们需要勾选“调试/显示调试”,这样才能在手柄上看到代表其指向的一条红色射线。但最关键的问题是,这个显示调试信息的功能只属于Debug调试模式,也就是说,一旦将项目正式打包发布,这条射线辅助线就没有了。如下图所示:我就觉得Unreal官方真的是有点过分了,这不应该是最基本的功能么?难道我们VR要在Debug模式下发布?

TxNet 1609

【数字孪生工业应用实战】第2篇:数字孪生系统架构设计与技术选型——从“作秀”到“实干”的骨架构建

本文系统剖析了数字孪生系统从“作秀”到“实干”的架构设计关键。针对多数项目在POC转生产时因架构混乱、选型盲目而失败的问题,深入阐述了四层分层架构(感知层、传输层、模型层、应用层)的设计原则,重点解析了感知层的异构适配与边缘预处理、传输层的异步解耦与多模式通信等工程细节。结合OPC UA、MQTT、EdgeX Foundry等主流技术选型对比,以及汽车焊装车间边缘智能网关的实战代码,提供了从零搭建微型孪生系统的完整指导。旨在帮助工程师建立清晰的选型决策逻辑,构建稳定、可演进的数字孪生“骨架”。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 264

说一下 jvm 有哪些垃圾回收器?,大牛深入讲解

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里题答案整理在了PDF文档里**[外链图片转存中…(img-x7UQqyEp-1710764052312)][外链图片转存中…(img-0O9kLlrr-1710764052312)]

m0_60388216的博客 979

咨询进阶——解读40页公司战略解码方法【附全文阅读】

战略解码是将企业战略转化为可执行计划的关键过程,强调垂直和水平一致性原则。通过KPI指标设计和目标分解,确保战略在各部门和岗位有效落地。解码过程包括战略澄清、目标牵引、绩效分解和承诺签订,输出战略解码图等文件。不同部门根据责任定位(如利润中心、绩效中心)采用差异化考核方式,实现战略有效执行。

cdfunlove的博客 148

【JVM基础12】——垃圾回收-说一下JVM有哪些垃圾回收器?

垃圾回收器详解

weixin_44382896的博客 625

Devexpress16.2.6破解工具

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

4.10 说一下 JVM 有哪些垃圾回收器?

它是JDK11中新引入的一种垃圾回收器,以获取最短回收停顿时间为目标,可以在不超过10ms的停顿时间内进行全堆垃圾回收,适用于超大型的内存应用场景。:它是一种以获取最短回收停顿时间为目标的垃圾回收器,使用分代收集算法进行垃圾回收,在回收过程中只暂停少量的应用线程,适用于大型的内存应用场景。:它是一种以获取最短回收停顿时间为目标的垃圾回收器,使用多线程进行垃圾回收,在回收过程中只暂停少量的应用线程,适用于响应时间敏感的应用场景。

Andrew_Lgx的博客 789

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

9.说一下 jvm 有哪些垃圾回收器?

《JVM几种垃圾回收器介绍》:https://www.cnblogs.com/blythe/p/7488061.html

面试题库 286

深度学习工具包 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")

24、说一下 JVM 有哪些垃圾回收器?

如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。

weixin_64235858的博客 275

JVM默认垃圾回收器扫盲,那些说UseParallelGC是 PS + Serial Old 的别再打脸了

首先来看下错误的示范,注意!!!是错误的!!! 本来你想靠百度,没想到进了个坑。博客地址就不贴了,希望各位楼主发博之前记得验证下,别再误导了。 两种错误方式!!! 尤其是第二张图这个博客主,不觉得打脸吗??? 还是自己动手好了 1.设置运行参数 ...

dandanforgetlove的专栏 1679

说一下 JVM 有哪些垃圾回收器?如何选择垃圾收集器?notify()和notifyAll()有什么区别?

如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。如果你的应用运行在单核的机器上,或者你的虚拟机核数只有单核,选择串行收集器依然是合。的一个优化,但它有很精确的应用场景,并且要求正确使用。优先的,并且对较长时间的停顿没有什么特别的要求。收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短。而对于某些定时任务,使用并行收集器,是一个比较好的选择。中等待的是相同的条件,唤醒任一个都能正确处理接下来的事。如果你的应用对响应时间要求较高,想要较少的停顿。

weixin_53180424的博客 558

高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?

标记-清除算法:该算法分为标记和清除两个阶段。在标记阶段,垃圾回收器会从GC Roots开始遍历所有可达的对象,并标记它们为活动对象。在清除阶段,垃圾回收器会遍历整个堆,回收所有未被标记的对象的内存。但这种方法可能会产生大量不连续的内存碎片。标记-整理算法:该算法是标记-清除算法的改进版本。它在标记和清除的基础上增加了整理阶段,将所有活动对象向一端移动,从而消除内存碎片。但这种方法可能会增加额外的开销。复制算法:该算法通常用于新生代垃圾回收。它将内存分为Eden空间和两个Survivor空间。

qq_43071699的博客 1142

面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有人点赞的这些年,我都是咬着牙过来的。Java中的垃圾回收器几乎是面试中的必考点,无论是面试初级,中级还是高级,总免不了要问一问垃...

Java知音 624

一文彻底搞懂八种JVM垃圾回收器

随着硬件技术的发展,可用内存越来越大,这为应用程序提供了更多的内存空间,从而能够创建更多的对象,减少了垃圾收集的频率。ZGC 的出现为 Java 应用提供了一种更加高效、可预测的垃圾回收解决方案,与传统的垃圾回收器相比,ZGC 的主要目标是实现极低的垃圾回收停顿时间,使得 Java 应用能够以更可预测的方式运行,尤其在大内存堆上表现良好。在这种场景下,传统的垃圾回收器可能会面临长时间的停顿,影响应用的响应性和用户体验,而 ZGC 能够有效地缓解这一问题,保持较低的停顿时间,从而确保应用的流畅运行。

永远在路上 8871
上一篇: Java面试题总结(乱序版,2020-08-31)
下一篇: Java面试题总结(乱序版,2020-09-03)
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值